/**************************************************************************************************************
	stefano guagnini
	1/2/2002
 **************************************************************************************************************
 
	Check.js 
	--------

 **************************************************************************************************************/
 
var _CharSet_alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var _CharSet_numbers = "0123456789";
var _CharSet_punct = ".,;:?!()*+";
var _CharSet_sep = " -/";
var _CharSet_blank = " ";
var _CharSet_emphasized = "áàèéìíòóùúÀÁÈÉÌÍÒÓÙ`";
var _CharSet_normalized = "aaeeiioouuAAEEIIOOU'";
var _CharSet_invalid = "|§";

var _lowerYear = 1847;
var _upperYear = 2100;

//**************************************************************************************************************

function stricmp( szStr1, szStr2 )
{	
	szStr1 = NormalizeString(szStr1.toUpperCase());
	szStr2 = NormalizeString(szStr2.toUpperCase());
	return szStr1 != szStr2;
}

//**************************************************************************************************************

function TrimString(szStr)
{
	while( szStr.length > 0 && CheckCharSet( szStr.charAt(0), _CharSet_blank ) )
		szStr = szStr.substr( 1 );

	while( szStr.length > 0 && CheckCharSet( szStr.charAt(szStr.length-1), _CharSet_blank ) )
		szStr = szStr.substr( 0, szStr.length-1 );
		
	return szStr;
}

//**************************************************************************************************************

function NormalizeString(szStr)
{
	szStr = TrimString(szStr);
	if ( szStr.length > 0 )
		for ( var k=0; k<_CharSet_emphasized.length; k++ )
		{
			while( szStr.indexOf(_CharSet_emphasized.charAt(k)) >= 0 )
				szStr = szStr.replace( _CharSet_emphasized.charAt(k), _CharSet_normalized.charAt(k) );
		}	
	return szStr;
}

//**************************************************************************************************************

function CheckCharSet( szStr, szSet, bFlag /*=in */ )
{
	if ( bFlag == null )
		bFlag = true;
	
	if ( bFlag )
	{
		//	szSet is the valid set
		for( var i = 0; i < szStr.length; i++ )
			if ( szSet.indexOf(szStr.charAt(i)) < 0 )
				return false;
				
		return true;
	}
	else
	{
		//	szSet is the invalid set
		for( var i = 0; i < szStr.length; i++ )
			if ( szSet.indexOf(szStr.charAt(i)) >= 0 )
				return false;

		return true;
	}
}

//**************************************************************************************************************

function CheckStringLength( szStr, minLen, maxLen )
{
	return (szStr.length==0) || (szStr.length >= ((minLen==null)?0:minLen)) && (szStr.length <= ((maxLen==null)?0xFFFF:maxLen));
}

//**************************************************************************************************************

function _CheckDataConsistency_controller(obj, checkReadOnly)	//	private
{
	var szWrong="", extraLegal="";
	
	
	var checkField = false;	
	if ( !obj.readOnly && !obj.disabled )
		checkField = true;
	else	
		checkField = false;
		
	if ( checkReadOnly != null )
		if ( checkReadOnly )		
			checkField = true;		


	//if ( (obj.tagName.toLowerCase() == "input" || obj.tagName.toLowerCase() == "textarea") && obj.desc != null && !obj.readOnly && !obj.disabled )
	if ( (obj.tagName.toLowerCase() == "input" || obj.tagName.toLowerCase() == "textarea") && obj.desc != null && checkField ) {

	
		var tp = obj.desc.split(";");	//	0->type (@=email, n/N=number, ...), 1->Description
		var tmp, lo=null, up=null;

		if ( obj.lowerbound != null && obj.lowerbound != "" )
			lo = eval(obj.lowerbound);

		if ( obj.upperbound != null && obj.upperbound != "" )
			up = eval( obj.upperbound );
			
		if ( (obj.type.toLowerCase() == "text" || obj.type.toLowerCase() == "password" || obj.type.toLowerCase() == "textarea") && (obj.value.length > 0) || (tp[0].toLowerCase()=="c" || tp[0].toLowerCase()=="cinit" || tp[0].toLowerCase()=="u" || tp[0].toLowerCase()=="cineuro") )
		{
			var szTmpErr="";

			if ( !CheckStringLength(obj.value,obj.minlength,obj.maxLength) )
				szTmpErr = " - " + tp[1] + " (controllare la lunghezza)";
		
			extraLegal = obj.type.toLowerCase() == "textarea" ? "\n" : "";
							
			switch( tp[0].toLowerCase() )
			{
				case "@":	//	email
				case "email":
					obj.value = NormalizeString(obj.value);
					if ( !CheckEmail(obj.value) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (email non valida)";
					break;
									
				case "euro":
				case "e":	//	valute in euro
					obj.value = NormalizeString(obj.value);
					if ( Number(lo) == NaN ) lo = null;
					if ( Number(up) == NaN ) up = null;
					if ( !CheckCharSet(obj.value,_CharSet_numbers+".") )
						szTmpErr = " - " + tp[1] + " (il campo deve indicare un importo valido)";
					else if ( lo != null && obj.value < Number(lo) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere maggiore/uguale a " + lo + ")";
					else if (up != null  && obj.value > Number(up) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere minore/uguale a " + up + ")";
					break;
									
				case "b":
				case "conto corrente":	//	conto corrente					
					obj.value = NormalizeString(obj.value).toUpperCase();
					if ( !CheckCharSet(obj.value,_CharSet_numbers+_CharSet_alpha) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (il campo deve indicare un conto corrente valido)";
					break;
					/*
					// Giu08. rcianni
					obj.value = NormalizeString(obj.value).toUpperCase();						
					if ( !CheckCharSet(obj.value,_CharSet_numbers) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere numerico)";						
					break;					
					*/
					

				case "msisdn":	//	mobile phone number (no prefix)
					obj.value = NormalizeString(obj.value);
					if ( !IsNumeric(obj.value) || obj.value.length < 6 || obj.value.length > 7 )
						szTmpErr = " - " + tp[1] + " (deve essere composto di 6 o 7 cifre)";
					break;

				case "prefix":
				case "fpx":		//	fix phone prefix (0???)
					obj.value = NormalizeString(obj.value);
					if ( Number(obj.value) == 0 )
					{
						obj.value = "";
						if ( obj.onchange != null )
							obj.onchange();
					}
					else if ( !IsNumeric(obj.value) || obj.value.length < 2 || obj.value.length > 4 || obj.value.charAt(0) != "0" )
						szTmpErr = " - " + tp[1] + " (il campo deve indicare un prefisso di rete fissa valido)";
					break;


	            case "fpxmobile": 	//	If text box is fix phone prefix and Mobile //Special case for DSATT - April 2010 Canvas
	                obj.value = NormalizeString(obj.value);
	                if (Number(obj.value) == 0) {
	                    obj.value = "";
	                    if (obj.onchange != null)
	                        obj.onchange();
	                }
	                else if (!IsNumeric(obj.value) || obj.value.length < 2 || obj.value.length > 4)
	                    szTmpErr = " - " + tp[1] + " (il campo deve indicare un prefisso di rete fissa o msisdn  valido)";
	                else if (obj.value.charAt(0) != "0" && obj.value.charAt(0) != "3")
	                    szTmpErr = " - " + tp[1] + " (il campo deve indicare un prefisso di rete fissa o msisdn  valido)";
	                break;	
				
				case "phone":
				case "fpn":		//	fix phone number
					obj.value = NormalizeString(obj.value);
					if ( obj.value == "0" )
					{
						obj.value = "";
						if ( obj.onchange != null )
							obj.onchange();
					}
					else if ( !IsNumeric(obj.value) || obj.value.length > 16 )
						szTmpErr = " - " + tp[1] + " (il campo deve indicare un numero di rete fissa valido)";
					break;
					
				case "n":	
				case "number":	//	number
					obj.value = NormalizeString(obj.value);
					if ( Number(lo) == NaN ) lo = null;
					if ( Number(up) == NaN ) up = null;
					if ( !CheckCharSet(obj.value,_CharSet_numbers) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere numerico)";
					else if ( lo != null && obj.value < Number(lo) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere maggiore/uguale a " + lo + ")";
					else if (up != null  && obj.value > Number(up) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere minore/uguale a " + up + ")";
					break;
									
				case "a":
				case "alpha":	//	alpha
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_alpha) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere alfabetico)";
					break;
									
				case "#":	//	alphanum
				case "alphanum":
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_numbers+_CharSet_alpha) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (Il campo deve essere alfanumerico)";
					break;
					
				case "iban":	//	alphanum, contry_code=IT, CIN IT, CIN E, CC
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_numbers+_CharSet_alpha) || CheckCharSet(obj.value,_CharSet_invalid) )
					{
						//szTmpErr = " - " + tp[1] + " (Il campo deve essere alfanumerico)";
						szTmpErr = " - Attenzione codice IBAN inserito non corretto. Si prega di verificare il dato.";
						
					}
					if (obj.value.substring(0, 2).toUpperCase() != "IT")
					{						
						//szTmpErr = " - " + tp[1] + " (La sezione Codice Paese deve essere IT)";		
						szTmpErr = " - Attenzione codice IBAN inserito non corretto. Si prega di verificare il dato.";			
						
					}	
					var paycc = obj.value.substring(15, 27);					
					if ( !CheckCharSet(paycc,_CharSet_numbers+_CharSet_alpha) || CheckCharSet(paycc,_CharSet_invalid) )
					{
						//szTmpErr = " - " + tp[1] + " (La sezione Conto Corrente deve essere numerica)";	
						szTmpErr = " - Attenzione codice IBAN inserito non corretto. Si prega di verificare il dato.";					
						
					}
					var paycinit = obj.value.substring(4, 5);			       
				    if( paycinit.length != 0 )
				    {				    	
				        if ( !CheckCharSet(paycinit,_CharSet_alpha) )
					    	//szTmpErr = " - " + tp[1] + " (La sezione CIN IT deve essere alfabetica)";
					    	szTmpErr = " - Attenzione codice IBAN inserito non corretto. Si prega di verificare il dato.";
					    
				    }
				    var paycineuro = obj.value.substring(2, 4);			        
				    if( paycineuro.length != 0 )
				    {
				    	if ( !CheckCharSet(paycineuro,_CharSet_numbers) || CheckCharSet(paycineuro,_CharSet_invalid) )
							//szTmpErr = " - " + tp[1] + " (La sezione CIN Euro deve essere numerica)";	
							szTmpErr = " - Attenzione codice IBAN inserito non corretto. Si prega di verificare il dato.";
						
					}
			        break;
					

				case "d":	
				case "description":	//	description (alphanum+blank+;,.-*/&:)
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_numbers+_CharSet_alpha+_CharSet_punct+_CharSet_sep+_CharSet_blank+"'&€$£%!=") || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (contiene caratteri invalidi)";
					break;

				case "f":
				case "fiscal code":	//	fiscal code
					obj.value = NormalizeString(obj.value).toUpperCase();
					if ( CheckFiscalCode(obj.value) <= 0 || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (codice fiscale non valido)";
					break;

				case "i":
				case "iva code":	//	iva code
					obj.value = NormalizeString(obj.value);
					if ( CheckIVACode(obj.value) <= 0 || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (partita iva non valida)";
					break;

				case "p":
				case "name":	//	nome/cognome *
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_alpha+_CharSet_blank+"'") || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (contiene caratteri invalidi)";
					break;

				case "yd":
				case "day":	//	data dd *
					obj.value = NormalizeString(obj.value);
					if ( Number(lo) == NaN ) lo = null; else lo = lo < 10 ? "0"+lo : lo;
					if ( Number(up) == NaN ) up = null; else up = up < 10 ? "0"+up : up;
					tmp = Number("0" + obj.value);
					if ( tmp < 1 || tmp > 31 || !CheckCharSet(obj.value,_CharSet_numbers))
						szTmpErr = " - " + tp[1] + " (giorno non valido)";
					else if ( lo != null && tmp < Number(lo) )
						szTmpErr = " - " + tp[1] + " (il giorno deve essere maggiore/uguale a " + lo + ")";
					else if (up != null  && tmp > Number(up) )
						szTmpErr = " - " + tp[1] + " (il giorno deve essere minore/uguale a " + up + ")";
					else
						obj.value =  tmp < 10 ? "0"+tmp : tmp;
					break;

				case "ym":
				case "month":	//	data mm *
					obj.value = NormalizeString(obj.value);
					if ( Number(lo) == NaN ) lo = null; else lo = lo < 10 ? "0"+lo : lo;
					if ( Number(up) == NaN ) up = null; else up = up < 10 ? "0"+up : up;
					tmp = Number("0" + obj.value);
					if ( tmp < 1 || tmp > 12 || !CheckCharSet(obj.value,_CharSet_numbers))
						szTmpErr = " - " + tp[1] + " (mese non valido)";
					else if ( lo != null && lo != "" && tmp < Number(lo) )
						szTmpErr = " - " + tp[1] + " (il mese deve essere maggiore/uguale a " + lo + ")";
					else if (up != null  && up != "" && tmp > Number(up) )
						szTmpErr = " - " + tp[1] + " (il mese deve essere minore/uguale a " + up + ")";
					else
						obj.value =  tmp < 10 ? "0"+tmp : tmp;
					break;

				case "yy":
				case "yyyy":
				case "year":	//	data yy or yyyy*
					obj.value = NormalizeString(obj.value);					
					tmp = Number("0" + obj.value);
					if ( tmp < _lowerYear )
						tmp = tmp < 30 ? 2000+Number(tmp) : 1900+Number(tmp);
					if ( lo != null && lo != "" )
					{
						var p = CheckDate(lo);
						if ( p != null )
							lo = p.getFullYear();
						else if ( lo < _lowerYear )
							lo = lo < 30 ? 2000+Number(lo) : 1900+Number(lo);
						else
							lo = null; 
					}
					if ( up != null && up != "" )
					{
						var p = CheckDate(up);
						if ( p != null )
							up = p.getFullYear();
						else if ( up < _lowerYear )
							up = up < 30 ? 2000+Number(up) : 1900+Number(up);
						else up = null;
					}

					if ( obj.value.length == 0 || !CheckCharSet(obj.value,_CharSet_numbers) || tmp < _lowerYear || tmp > _upperYear )
						szTmpErr = " - " + tp[1] + " (anno non valido)";
					else if ( lo != null && tmp < Number(lo) )
						szTmpErr = " - " + tp[1] + " (l'anno deve essere maggiore/uguale a " + lo + ")";
					else if (up != null  && tmp > Number(up) )
						szTmpErr = " - " + tp[1] + " (l'anno deve essere minore/uguale a " + up + ")";
					else
						obj.value = tp[0].toLowerCase() == "yy" ? ("" + tmp).substr(2,2) : tmp;
					break;
								
				case "ymy":
				case "month year":	//	data mmyy[yy] *
					obj.value = NormalizeString(obj.value);
					if ( lo != null && lo != "" )
					{
						var p = CheckDate(lo);
						if ( p == null )
						{
							if ( lo.indexOf("/") < 0 )
								p = CheckDate("01"+lo);
							else
								p = CheckDate("1/"+lo);
						}

						lo = p;
					}
					
					if ( up != null && up != "" ) 
					{
						var p = CheckDate(up);
						if ( p == null )
						{
							if ( up.indexOf("/") < 0 )
								p = CheckDate("01"+up);
							else
								p = CheckDate("1/"+up);
						}
						up = p;
					}
					
					strvalue = obj.value;
					if (strvalue.indexOf("/") > 0)
						strvalue  = strvalue.replace( "/", "" );
						
					//if ( CheckCharSet(obj.value,_CharSet_numbers) && (obj.value.length == 4 || obj.value.length == 6) )
					if ( CheckCharSet(strvalue,_CharSet_numbers) && (strvalue.length == 4 || strvalue.length == 6) )					
					{
						if (obj.value.indexOf("/") < 0)
							tmp = CheckDate( "01"+obj.value );
						else
							tmp = CheckDate( "1/"+obj.value );	
							
						if ( tmp != null )
						{
							if ( lo != null && (tmp.getFullYear() < lo.getFullYear() || (tmp.getFullYear() == lo.getFullYear() && tmp.getMonth() < lo.getMonth())) )
							{
								szTmpErr = " - " + tp[1] + " (deve essere maggiore/uguale a " + Number(lo.getMonth()+1) + "/" + lo.getFullYear() + ")";
								break;
							}
							if ( up != null && (tmp.getFullYear() > up.getFullYear() || (tmp.getFullYear() == up.getFullYear() && tmp.getMonth() > up.getMonth())) )
							{
								szTmpErr = " - " + tp[1] + " (deve essere minore/uguale a " + Number(up.getMonth()+1) + "/" + up.getFullYear() + ")";
								break;
							}
							else break;
						}
					}
					szTmpErr = " - " + tp[1] + " (data non valida)";
					break;		

				case "y":
				case "date":	//	data dd/mm/yyyy *
					obj.value = NormalizeString(obj.value);
					if ( lo != null && lo != "" ) lo = CheckDate(lo);
					if ( up != null && up != "" ) up = CheckDate(up);
					tmp = CheckDate(obj.value);

					if ( tmp==null )
						szTmpErr = " - " + tp[1] + " (data non valida)";
					else if ( lo != null & tmp < lo )
						szTmpErr = " - " + tp[1] + " (la data deve essere maggiore/uguale a " + lo.getDate()+"/"+Number(lo.getMonth()+1)+"/"+lo.getFullYear() +")";
					else if ( up != null & tmp > up )
						szTmpErr = " - " + tp[1] + " (la data deve essere minore/uguale a " + up.getDate()+"/"+Number(up.getMonth()+1)+"/"+up.getFullYear() +")";
					else 
					{
						var dd = tmp.getDate() < 10 ? "0"+tmp.getDate() : tmp.getDate();
						if ( tmp.getDate() < 10 )
							dd = "0"+tmp.getDate()
						else
							dd = tmp.getDate()
										
						var mm = tmp.getMonth() < 9 ? "0"+(tmp.getMonth()+1) : (tmp.getMonth()+1);
						obj.value = dd+"/"+mm+"/"+tmp.getFullYear();

						if ( obj.age_required != null && obj.age_required > 0 )
						{
							var now = new Date();

							if ( (now.getFullYear() - tmp.getFullYear() < obj.age_required) || 								 
								 (now.getFullYear() - tmp.getFullYear() == obj.age_required && now.getMonth() < tmp.getMonth()) || 								 
								 (now.getFullYear() - tmp.getFullYear() == obj.age_required && now.getMonth() == tmp.getMonth() && now.getDate() < tmp.getDate()) )							 
								szTmpErr = " - " + tp[1] + " (l'età minima richiesta e' "+ obj.age_required +" anni)";
						}
					}
					break;
								
				case "s":
				case "address":	//	address
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value.charAt(0),_CharSet_alpha) )
						szTmpErr = " - " + tp[1] + " (il primo carattere deve essere alfabetico)";
					else if ( !CheckCharSet(obj.value,_CharSet_alpha+_CharSet_numbers+_CharSet_blank+".+,-/'\\°") || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (contiene caratteri invalidi)";
					break;

				case "m":
				case "sim":	//	SIM number
					if ( !CheckSimNum(obj.value) )
						szTmpErr = " - " + tp[1] + " (numero di SIM non valido)";
					break;

				case "im":
				case "imei":
					if ( !IsNumeric(obj.value) || obj.value.length != 15 )
						szTmpErr = " - " + tp[1] + " (il campo deve contenere 15 cifre)";
					break;
					
				case "v":	
				case "vcard":	//	value card
					obj.value = NormalizeString(obj.value);
					if ( !CheckCharSet(obj.value,_CharSet_numbers) || CheckCharSet(obj.value,_CharSet_invalid) || (obj.value.length != 0 && obj.value.length != 14 && obj.value.length != 16) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere numerico di 14 o 16 cifre)";					
					break;

			    case "c":
			    case "cinit":   //  cin italia
			        obj.value = NormalizeString(obj.value.toUpperCase());
				    if( obj.value.length != 0 )
				    {
				        if ( !CheckCharSet(obj.value,_CharSet_alpha) )
					    szTmpErr = " - " + tp[1] + " (il campo deve essere alfabetico)";
				        else if ( obj.validated == "N" )
				            szTmpErr = " - " + tp[1] + " (e' necessario reinserire il dato corretto o cancellarlo)";
				    }
			        break;

			    case "u":
			    case "cineuro": //  cin euro
			        obj.value = NormalizeString(obj.value);
				    if( obj.value.length != 0 )
				      {
				    if ( !CheckCharSet(obj.value,_CharSet_numbers) || CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (il campo deve essere numerico)";					
					else if ( obj.validated == "N" )
					    szTmpErr = " - " + tp[1] + " (e' necessario reinserire il dato corretto o cancellarlo)";
					}
			        break;

				case "*":	//	any other...
				default:
					obj.value = NormalizeString(obj.value);
					if ( CheckCharSet(obj.value,_CharSet_invalid) )
						szTmpErr = " - " + tp[1] + " (contiene caratteri invalidi)";
					break;
			}

			szWrong += szTmpErr;
		}
	}
	

	return szWrong;
}

function CheckDataConsistency(pObj)
{
	var szWrong = "";

	if ( pObj != null )
	{
		if ( (pObj.tagName.toLowerCase() == "input" || pObj.tagName.toLowerCase() == "textarea") && InputManager.IsDisplayed(pObj))
		{
				szWrong = _CheckDataConsistency_controller(pObj);
		}
		else
		{	
			for( var k=0; k < pObj.all.length; k++ )
			{
				if ( InputManager.IsDisplayed(pObj.all(k)) )
				{
					var r = _CheckDataConsistency_controller(pObj.all(k));
					if ( r.length )
						szWrong += r + "\n";
				}
			}
		}
	}

	return szWrong;
}	

// Giu08. rcianni
// CheckDataListConsistency() funziona come la CheckDataConsistency() ma controlla anche i campi ReadOnly
// in input riceve la lista dei campi da controllare
function CheckDataListConsistency()
{
	var szWrong = "";

	if ( arguments.length )
	{
		var pArray = arguments, obj;
		var k = 0;

		for( ; k<pArray.length; k++ )
		{
			var obj = pArray[k];			
			
			var r = _CheckDataConsistency_controller(obj, true);
			if ( r.length )
				szWrong += r + "\n";
		}
	}

	return szWrong;
}

//**************************************************************************************************************

function CheckMandatoryData(pObj)
{
	var szMissing = "";

	if ( pObj != null )
	{
		for( var k=0; k < pObj.all.length; k++ )
		{
			var obj = pObj.all(k);
			if ( obj.desc != null )// && InputManager.IsDisplayed(obj) )
			{
				if ( obj.tagName.toLowerCase() == "input" || obj.tagName.toLowerCase() == "textarea" )
				{
					if ( obj.className.toLowerCase() == "mandatoryinput" )
						if ( obj.type.toLowerCase() == "text" || obj.type.toLowerCase() == "textarea" || obj.type.toLowerCase() == "password" )
							if ( TrimString(obj.value).length <= 0 )
							{
								var tp = obj.desc.split(";");	//	0->type, 1->description
								szMissing += (szMissing.length ? ", ":"") + tp[1];
							}
				}
				else if ( obj.tagName.toLowerCase() == "select" )
				{
					if ( obj.className.toLowerCase() == "mandatoryinput" )
						if ( DDLManager.GetSelection(obj,"text") == "" )
							szMissing += (szMissing.length ? ", ":"") + obj.desc;
				}
			}
		}
	}
	
	return szMissing;
}

//**************************************************************************************************************

function MaySelectText()
{
	var p=document.activeElement;
	return (p.tagName.toLowerCase()=="input" && p.type.toLowerCase()=="text") || p.tagName.toLowerCase()=="textarea";
}

//**************************************************************************************************************

function IsNumeric( szStr )
{
	return CheckCharSet( szStr, _CharSet_numbers );
}

//**************************************************************************************************************

function CheckSimNum(szSIM)
{
	var nSimLen=19, nCheck=0, nj, nEven, nOdd;

	if ( szSIM.length != nSimLen )
		return false;
			
	for ( nj=0; nj < nSimLen; nj++ )
	{
		if ( szSIM.charAt(nj) < "0" || szSIM.charAt(nj) > "9" )
			return false;
		else if ( nj < nSimLen-1 )
		{
			if (nj % 2) 
			{
				var tmp = 2*parseInt(szSIM.charAt(nj));
				nCheck += (tmp % 10) + ((tmp - (tmp % 10)) / 10);
			}
			else nCheck += parseInt(szSIM.charAt(nj));
		}
	}
			
	nCheck = 10 - ( nCheck % 10 )
	nCheck = nCheck == 10 ? 0 : nCheck;
	if ( nCheck  != parseInt(szSIM.charAt(18)) )
		return false;				
			
	return true;		
}

//**************************************************************************************************************

function CheckEmail(email)
{
	var s1, s2, err=0, k;
	
	if ( email.length )
	{
		if ( CheckCharSet(email,_CharSet_blank) )
		{
			//	senza spazi all'interno
			err++;
		}
		else 
		{
	
			s1 = email.split( "@" );	
			
			if ( s1.length != 2 )
			{
				//	devo avere user@domain senza spazi all'interno
				err++;
			}
			else if ( s1[0].length==0 || s1[1].length==0 )
			{
				//	non devono essere vuoti
				err++;
			}	
			else 
			{
				
				s2 = s1[1].split(".");

				if ( s2.length < 2 )
				{
					//	domain deve contenere almeno un punto
					err++;
				}	
				else 
				{
					// nessuna vuota...
					for ( k = 0; k < s2.length; k++ )
						if ( s2[k].length == 0 )
							err++;
				}	
			}
		}
	}
	
	return err == 0;
}

//**************************************************************************************************************

function CheckFiscalCode(szCode/*, ... */)
{
	if ( !CheckCharSet(szCode,_CharSet_numbers+_CharSet_alpha) || szCode.length != 16 )
		return 0;

	szCode = NormalizeString(szCode.toUpperCase());
	var sum = 0;
	var encode = "BAKPLCQDREVOSFTGUHMINJWZYX";

	for( var i = 0; i < 15; i++ )
	{
		var ch = szCode.charAt(i);
		
		if( i % 2 )
			sum += CheckCharSet(ch,_CharSet_alpha) ? Number(ch.charCodeAt(0)-65) : parseInt( ch );
		else
			sum += encode.indexOf( CheckCharSet(ch,_CharSet_alpha) ? ch :  _CharSet_alpha.charAt(26+parseInt(ch)) );
	}

	if( szCode.charAt(15) != _CharSet_alpha.charAt(26+(sum % 26)) )	
		return 0;
	else if ( arguments.length == 1 )
		return 1;

	var co = RSExecute( RS_DSQR_URL, 
						RS_DSQR_CheckFiscalCodeMethod, 
						arguments[0],	// szCode,
						arguments[1],	// szFirstName
						arguments[2],	// szLastName
						arguments[3],	// szProv
						arguments[4],	// szCity
						arguments[5],	// szBirthDate
						arguments[6]);  // szSex

	if ( HandleRSError(co) )
		return Number(co.return_value) > 0 ? 1 : 0;
	else 
		return 1; // nb: se fallisce chiamata assumo corretto...eventualmente blocca il BE
}

//**************************************************************************************************************

function CheckIVACode(szCode/*, ... */)
{
	var ret = 0;

	if ( szCode.length == 7 )
	{
		//	San Marino
		if ( szCode.substr(0,2).toUpperCase() != "SM" )
			return 0;
			
		if ( !CheckCharSet(szCode.substr(2,5),_CharSet_numbers) )
			return 0;
	}
	else if ( szCode.length == 11 )
	{
		if ( !CheckCharSet(szCode,_CharSet_numbers) )
			return 0;
		
		var sum = 0;
		for( var x = 0; x < 10; x++ )
		{
			val = parseInt( szCode.charAt( x ) );
			
			if( x % 2 )
			{
				var tmp = (val * 2);
				sum += (tmp % 10) + ((tmp - (tmp % 10)) / 10);
			}
			else sum += val;
		}

		sum = 10 - ( sum % 10 );
		sum = sum == 10 ? 0 : sum;
		
		if ( sum != parseInt( szCode.charAt(10) ) )
			return 0;
	}
	else return 0;

	if ( arguments.length == 1 )
		return 1;

	var co = RSExecute( RS_DSQR_URL,
						RS_DSQR_CheckIVACodeMethod, 
						arguments[0].toUpperCase(),   // szCode,
						arguments[1],   // szProv
						arguments[2] ); // szCity 

	if ( HandleRSError(co) )
		return Number(co.return_value);

	return -1;
}

//**************************************************************************************************************


function CheckDate( szDate )
{	//	input as: ddmmyyyy, ddmmyy, dd/mm/yyyy, dd.mm.yyyy, dd-mm-yyyy
	//	ret Date object -> Ok, null -> Ko

	var vDate = szDate.split("/"), dd=0, mm=0, yy=0;

	if ( vDate.length!=3 )
		vDate = szDate.split(".");
	
	if ( vDate.length!=3 )
		vDate = szDate.split("-");

	if ( vDate.length==3 )
	{
		if ( !IsNumeric(vDate[0]) || !IsNumeric(vDate[1]) || !IsNumeric(vDate[2]) )
			return null;
			
		dd=Number(vDate[0]);
		mm=Number(vDate[1]);
		yy=Number(vDate[2]);
	}
	else if ( (szDate.length==6 || szDate.length==8) && IsNumeric(szDate) )
	{
		dd=szDate.substr( 0, 2 );
		mm=szDate.substr( 2, 2 );
		yy=szDate.substr( 4, 4 );
	}

	//	check year
	if ( yy < 100 )
	{
		if ( yy < 30 )
			yy = Number(yy)+2000;
		else
			yy = Number(yy)+1900;
	}
	if ( yy < _lowerYear || yy > _upperYear )
		return null;
		
	//	check month
	if ( mm < 1 || mm > 12 )
		return null;
		
	//	check day
	if ( mm == 4 || mm == 6 || mm == 9 || mm == 11 )
		max = 30;
	else if ( mm == 2 )
		max = ((yy % 4 == 0) && (yy % 100 != 0) || (yy % 400 == 0)) ? 29 : 28;
	else // mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12 
		max = 31;
		
	if ( dd < 1 || dd > max )
		return null;
			
	return new Date( yy, mm-1, dd, 0, 0, 0, 0);
}

//**************************************************************************************************************

function CheckPhoneNumber( area, number, bFix )
{
	if ( bFix == null )
		bFix = true;

	if ( (area != "" && number == "") || (area == "" && number != "") )
		return false;
		
	if ( !CheckCharSet(area,_CharSet_numbers) || !CheckCharSet(number,_CharSet_numbers) ) 
		return false;
	
	if ( bFix && area.length > 0 )
	{
		if ( area.length < 2 || area.charAt(0) != "0" )
			return false;
	}
	else if ( area.length > 0 )
	{
		if ( area.length != 3 )
			return false;
	}

	return true;
}

//**************************************************************************************************************

function CheckDealerCode( szCode )
{
	if ( typeof(szCode) != "string" ) return false;
	if ( szCode.length != 11 ) return false;
	var v = szCode.toUpperCase().split(".");
	if ( v.length != 2 ) return false;
	if ( v[0].length != v[1].length ) return false;
	if ( !CheckCharSet(v[0],_CharSet_numbers+_CharSet_alpha) ) return false;
	if ( !CheckCharSet(v[1],_CharSet_numbers+_CharSet_alpha) ) return false;
	return true;
}

//**************************************************************************************************************

function CalcCINCode( ABI, CAB, CCN )
{
	if ( ABI.length!=5 || CAB.length!=5 || CCN.length!=12 )
		return "";

	var sz = (ABI+CAB+CCN).toUpperCase();
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var even = new Array(0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28);
	var odd = new Array(1,0,5,7,9,13,15,17,19,21,1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26);
	var ret=0;

	for ( var k=0; k<22; k++ ) 
	{
		var j = chars.indexOf( sz.charAt(k) );
		if ( j >= 0 )
			ret += (k % 2 == 0) ? odd[j] : even[j];
		else
			return "";
	}
    var retchar = _CharSet_alpha.charAt(ret % 26+26);
    return retchar;
}



function VerifyCINItaCode( ABI, CAB, CCN, CinIt )
{
    var cin = CalcCINCode( ABI, CAB, CCN );

    if ( cin == "" || CinIt == null)
        return "";
    
    return (cin.toUpperCase() == CinIt.toUpperCase()) ? "Y" : "N";
}

function VerifyCINEuroCode( ABI, CAB, CCN, CinEu )
{
    var CinIt = CalcCINCode( ABI, CAB, CCN );
    
    if ( CinIt == ""  || isNaN(Number(CinEu)))
        return "";
        
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var sz = (CinIt + ABI + CAB + CCN + "IT" + CinEu).toUpperCase();
    var cin = "";
    var k;

    cin = "";

    for ( k=0; k<sz.length; k++ )
        cin += chars.indexOf(sz.charAt(k));

    while( cin.length > 2 )
    {
        var r = Number(cin.substr(0,3)) % 97;
        cin = "" + r + cin.substr(3);
    }

    //  NB: potrebbero restare 98 e 99 ancora divisibili...
    
    return (Number(cin)%97==1) ? "Y" : "N";
}

//**************************************************************************************************************
