// [PB] esempio di data e ora: d/m/yyyy h:n:s am
// [PB] esempio di data e ora: dd/mm/yyyy hh:nn:ss


// ----------------------- CONSTANTS -----------------------------
			var CONST_TS_DEFAULT_DECIMAL_SEPARATOR	= ".";
			var CONST_TS_DEFAULT_KILO_SEPARATOR			= ",";

			var	vDecimalSeparator	= new Array(".", ",");
			var	vKiloSeparator		= new Array(",", ".", "'");
			var vDateSeparator		= new Array("/", "-");
			var vTimeSeparator		= new Array(":", ".");
// --------------------- fine CONSTANTS --------------------------

			var defaultDecimalSeparator = CONST_TS_DEFAULT_DECIMAL_SEPARATOR;
			var defaultKiloSeparator = CONST_TS_DEFAULT_KILO_SEPARATOR;

			var re_yy	=	"([0-9][0-9])";
			var re_YYYY	=	"([0-9][0-9][0-9][0-9])";
			var re_M	=	"([0-1]?[0-9])";
			var re_MM	=	"([0-1][0-9])";
			var re_D	=	"([0-3]?[0-9])";
			var re_DD	=	"([0-3][0-9])";

			var re_H	=	"((?:[0-1]?[0-9])|(?:2[0-4]))";
			var re_HH	=	"((?:[0-1][0-9])|(?:[2][0-4]))";
			var re_N	=	"([0-5]?[0-9])";
			var re_NN	=	"([0-5][0-9])";
			var re_S	=	"([0-5]?[0-9])";
			var re_SS	=	"([0-5][0-9])";
			var re_AM	= "(?: ((?:[aA][mM])|(?:[pP][mM])))?";

			var re_Sign = "[+-]?";

			var re_Unsigned_UnKilo 	= "(?:[0-9]+)";
			var re_Integer_UnKilo 	= "(?:" + re_Sign + re_Unsigned_UnKilo + ")";

			var re_Triplet						= "(?:[0-9]{1,3})";
			var re_Full_Triplet				= "(?:[0-9]{3})";

			var re_Alphabetic = "[a-zA-Z_]+";
			var re_Alphanumeric = "[a-zA-Z0-9_]+"; // [PB] ... da rivedere la reg_exp ...


			function isNull ( value )
			{
				return (value == null);
			}

			function checkDecimalSeparator ( cDecimalSeparator )
			{
				if ( !isNull(cDecimalSeparator) )
					for( i = 0; i < vDecimalSeparator.length; i++)
						if ( cDecimalSeparator == vDecimalSeparator[i] )
							return cDecimalSeparator;

				return CONST_TS_DEFAULT_DECIMAL_SEPARATOR;
			}

			function checkKiloSeparator ( cKiloSeparator )
			{
				if ( !isNull(cKiloSeparator) )
					for( i = 0; i < vKiloSeparator.length; i++)
						if ( cKiloSeparator == vKiloSeparator[i] )
							return cKiloSeparator;

				return CONST_TS_DEFAULT_KILO_SEPARATOR;
			}

			function getDefaultDecimalSeparator ()
			{
				return defaultDecimalSeparator;
			}

			function setDefaultDecimalSeparator ( cDecimalSeparator )
			{
				defaultDecimalSeparator = checkDecimalSeparator( cDecimalSeparator );
				return defaultDecimalSeparator;
			}

			function getDefaultKiloSeparator ()
			{
				return defaultKiloSeparator;
			}

			function setDefaultKiloSeparator ( cKiloSeparator )
			{
				defaultKiloSeparator = checkKiloSeparator( cKiloSeparator );
				return defaultKiloSeparator;
			}

			function isEmpty ( sString )
			{
				return (sString == "");
			}

			function isAlphabetic ( sString )
			{
				if (isEmpty( sString ) )
					return false;
				re = new RegExp ("^" + re_Alphabetic + "$", "");
				return re.test( sString );
			}

			function isAlphanumeric ( sString )
			{
				if (isEmpty( sString ) )
					return false;
				re = new RegExp ("^" + re_Alphanumeric + "$", "");
				return re.test( sString );
			}

			function isInteger ( sString , cKiloSeparator, bKiloSeparated )
			{
				if ( isEmpty( sString ) )
					return false;

				cKiloSeparator = checkKiloSeparator( cKiloSeparator );
				sRegExpIntegerKilo = "(?:" + re_Sign + re_Triplet + "(?:" + cKiloSeparator + re_Full_Triplet + ")*)";

				if ( isNull(bKiloSeparated) )
					sRegExpInt = "(?:" + re_Integer_UnKilo + "|" + sRegExpIntegerKilo + ")";
				else if (bKiloSeparated)
					sRegExpInt = sRegExpIntegerKilo;
				else
					sRegExpInt = re_Integer_UnKilo;

				re = new RegExp ("^" + sRegExpInt + "$", "");
				return re.test( sString );
			}

			function isFloat ( sString , cDecimalSeparator, cKiloSeparator, bKiloSeparated)
			{
				if (isEmpty( sString ) )
					return false;

				cDecimalSeparator = checkDecimalSeparator( cDecimalSeparator );
				cKiloSeparator = checkKiloSeparator( cKiloSeparator );

				sRegExpIntegerKilo = "(?:" + re_Sign + re_Triplet + "(?:" + cKiloSeparator + re_Full_Triplet + ")*)";

				if ( isNull(bKiloSeparated) )
					sRegExpInt = "(?:" + re_Integer_UnKilo + "|" + sRegExpIntegerKilo + ")";
				else if (bKiloSeparated)
					sRegExpInt = sRegExpIntegerKilo;
				else
					sRegExpInt = re_Integer_UnKilo;

				sRegExp = sRegExpInt + "(?:" + cDecimalSeparator + re_Unsigned_UnKilo + ")?";
				re = new RegExp ("^" + sRegExp + "$", "");
				return re.test( sString );
		}

			function isDate ( sDate , sFormat )
			{
				if (isEmpty( sDate ) || isEmpty( sFormat ) )
					return false;

				for( i = 0; i < vDateSeparator.length; i++)
				{
					vSplit = sFormat.split( vDateSeparator[i] );
					if (vSplit.length == 3)
						break;
				}
				if ( i == vDateSeparator.length )
					return false;

				cDateSeparator = vDateSeparator[i];
				sRegExp = "";

				posYear 	= 0;
				posMonth 	= 0;
				posDay 		= 0;

				for( i = 0; i < vSplit.length; i++)
				{
					if (i > 0 )
						sRegExp += cDateSeparator;

					switch (vSplit[i])
					{
						case "yyyy" :
							if (posYear != 0) return false;
							posYear = i + 1;
							sRegExp += re_YYYY;
							break;
						case "yy" :
							if (posYear != 0) return false;
							posYear = i + 1;
							sRegExp += re_YY;
							break;
						case "mm" :
							if (posMonth != 0) return false;
							posMonth = i + 1;
							sRegExp += re_MM;
							break;
						case "m" :
							if (posMonth != 0) return false;
							posMonth = i + 1;
							sRegExp += re_M;
							break;
						case "dd" :
							if (posDay != 0) return false;
							posDay = i + 1;
							sRegExp += re_DD;
							break;
						case "d" :
							if (posDay != 0) return false;
							posDay = i + 1;
							sRegExp += re_D;
							break;
						default :
							return false;
					}
				}

				re = new RegExp ("^" + sRegExp + "$", "");
				if ( re.test( sDate ) )
				{
					return isDateValid(
															sDate.replace(re, "$" + posYear),
															sDate.replace(re, "$" + posMonth),
															sDate.replace(re, "$" + posDay)
														);
				}
				return false;
			}

			function isTime ( sTime , sFormat )
			{
				if (isEmpty( sTime ) || isEmpty( sFormat ) )
					return false;

				for( i = 0; i < vTimeSeparator.length; i++)
				{
					vSplit = sFormat.split( vTimeSeparator[i] );
					if (vSplit.length == 2 || vSplit.length == 3)
						break;
				}
				if ( i == vTimeSeparator.length )
					return false;

				cTimeSeparator = vTimeSeparator[i];

				// [PB] se l'ultimo "split" e' piu' lungo di 2 verifico la presenza di "am"
				bAM = false;
				if ( vSplit[vSplit.length - 1].length > 2)
				{
					vTemp = vSplit[vSplit.length - 1].split(" ");
					if (vTemp.length != 2)
						return false;
					vSplit[vSplit.length - 1]	= vTemp[0];
					bAM = true;
				}

				sRegExp = "";

				posHour 	= 0;
				posMinute	= 0;
				posSecond	= 0;

				for( i = 0; i < vSplit.length; i++)
				{
					if (i > 0 )
						sRegExp += cTimeSeparator;

					switch (vSplit[i])
					{
						case "hh" :
							if (posHour != 0) return false;
							posHour = i + 1;
							sRegExp += re_HH;
							break;
						case "h" :
							if (posHour != 0) return false;
							posHour = i + 1;
							sRegExp += re_H;
							break;
						case "nn" :
							if (posMinute != 0) return false;
							posMinute = i + 1;
							sRegExp += re_NN;
							break;
						case "n" :
							if (posMinute != 0) return false;
							posMinute = i + 1;
							sRegExp += re_N;
							break;
						case "ss" :
							if (posSecond != 0) return false;
							posSecond = i + 1;
							sRegExp += re_SS;
							break;
						case "s" :
							if (posSecond != 0) return false;
							posSecond = i + 1;
							sRegExp += re_S;
							break;
						default :
							return false;
					}
				}

				// [PB] Se ho solo un separatore, devono mancare i secondi!
				if ( (vSplit.length == 2) && (posSecond != 0) )
					return false;

				// [PB] Il formato immesso richiede la presenza di am/pm (preceduto da UNO spazio)
				if ( bAM )
					sRegExp +=  re_AM;

				re = new RegExp ("^" + sRegExp + "$", "");

				if ( re.test( sTime ) )
				{
					return isTimeValid(
															sTime.replace(re, "$" + posHour),
															sTime.replace(re, "$" + posMinute),
															((posSecond == 0) ? "" : sTime.replace(re, "$" + posSecond)),
															((bAM) ? sTime.replace(re, "$" + ( (posSecond == 0) ? "3" : "4") ) : "" ),
															!bAM
														);
				}
				return false;
			}

			function changeDateFormat( sDate, sFormatFrom, sFormatTo )
			{
				if (isEmpty( sDate ) || isEmpty( sFormatFrom ) || isEmpty( sFormatTo ))
					return null;

				// [PB] Questa solo in attesa delle implementazioni future!!
				if ((sFormatFrom != "d/m/yyyy" ) || ( sFormatTo != "yyyy-m-d"))
					return null;

				if ( isDate( sDate, "d/m/yyyy") )
				{
					re = new RegExp ("^" + re_D + "/" + re_M + "/" + re_YYYY + "$", "");
					return sDate.replace(re, "$3-$2-$1");
				}
				return null;
			}

	/**
	 * Verifica la validità di una data partendo dalle componenti Anno, Mese e Giorno.
	 *
	 * @param sYear (int) Anno della data da verificare.
	 * @param sMonth (int) Mese della data da verificare.
	 * @param sDay (int) Giorno della data da verificare.
	 * @return (boolean) true se la data è valida, false altrimenti.
	 */
			function isDateValid( sYear, sMonth, sDay)
			{
				year	= parseInt( sYear, 10 );
				month	= parseInt( sMonth, 10 );
				day		= parseInt( sDay, 10 );

				// [PB] Per prima cosa non vogliamo stupidate!
				if ( isNaN(year) || isNaN(month) || isNaN(day) )
					return false;

				// [PB] Seconda cosa, vogliamo valori sensati!
				if (month < 1 || day < 1 || month > 12 || day > 31)
					return false;

				// [PB] Verifico i mesi da 30 giorni
				if (((month == 4) || (month == 6) || (month == 9) || (month == 11)) && (day > 30)) {
				return false;
				}

				// [PB] Verifico febbraio per gli anni bisestili (solo 29 giorni)
				var leapyear =	(
												(Math.floor(year/4) == (year/4)) &&
												(
													(Math.floor(year/100) != (year/100)) ||
													(Math.floor(year/400) == (year/400))
												)
											);
				if ( leapyear && (month == 2) && (day > 29) )
				return false;

				// [PB] Verifico febbraio per tutti gli altri anni (solo 28 giorni)
				if ( (month == 2) && (day > 28) && (leapyear == false) )
				return false;

				// [PB] A questo punto... allora va bene!
				return true;
			}


	/**
	 * Verifica la validità di un'ora partendo dalle componenti Ora, Minuto e Secondo con l'eventuale specifica di am/pm
	 * tenendo conto della modalità 12/24 ore.
	 *
	 * @param sHour Ora dell'ora da verificare.
	 * @param sMinute Minuto dell'ora da verificare.
	 * @param sSecond Secondo dell'ora da verificare.
	 * @param sMeridiam Valore am/pm dell'ora da verificare.
										I valori ammessi sono le stringhe "am" e "pm" case insensitive.
										Nel caso non sia specificato am/pm è comunque necessaria la stringa vuota ("").
	 * @param bMode24 Opzionale: specifica la modalità 24/12 dell'ora da verificare.
										true indica la modalità 24 ore; false indica la modalità 12 ore.
										Se non specificato assume di default il valore true.
	 * @return (boolean) true se la data è valida, false altrimenti.
	 */
			function isTimeValid( sHour, sMinute, sSecond, sMeridiam, bMode24)
			{
				if ( isNull(bMode24) )
					bMode24 = true;

				if ( bMode24 && !isEmpty(sMeridiam) )
						return false;

				if ( !bMode24 && !isEmpty(sMeridiam) && (sMeridiam.toLowerCase() != "am") && (sMeridiam.toLowerCase() != "pm") )
						return false;

				hour		= parseInt( sHour, 10 );
				minute	= parseInt( sMinute, 10 );
				if ( isEmpty(sSecond) )
					sSecond = "0";
				second	= parseInt( sSecond );

				// [PB] Come al solito, non vogliamo stupidate!
				if ( isNaN(hour) || isNaN(minute) || isNaN(second) )
					return false;

				// [PB] Come al solito, vogliamo valori sensati!
				if ( hour < 0 || (bMode24 && hour > 24) || (!bMode24 && hour > 12) || minute < 0 || minute > 59  || second < 0 || second > 59 )
					return false;

				// [PB] A questo punto... allora va bene!
				return true;
			}



// [PB] progettazione a zero per questa ...
// [PB] risponde alla stretta necessita'!!

			function escapeQuotes(text)
			{
				text = text.replace(new RegExp("\'" , 'g'), "&#39;");
				text = text.replace(new RegExp("\"" , 'g'), "&quot;");
				return text;
			}
			
			function unescapeQuotes(text)
			{
				text = text.replace(new RegExp("&#39;" , 'g'), "\'");
				text = text.replace(new RegExp("&quot;" , 'g'), "\"");
				return text;
			}

//	[FV] da sistemare 
//	(servono per i prezzi)

		function togliMigliaia(s,sepMig,sepDec)
			{
			if (!isEmpty(s)) {
				if ( sepMig==null ) {
					sepMig=".";
				}
				if ( sepDec==null ) {
					sepDec=",";
				}
				a=s.indexOf(sepDec);
			  if (a==-1) a=s.length;
			  var temp = "";
			  b=s.length;
			  while (a>4)
			  {    	
			    a=a-3;
			    temp = s.substring(a,b) + temp;
			    a=a-1;
			    b=a;
			  }
			  temp=s.substring(0,b) + temp;  	
			  //alert("stringa finale:"+temp);
			  return temp;
			}  
			return "";
		}
		
		function mettiMigliaia(s,sepMig,sepDec)
			{	
			if (!isEmpty(s)) {	
				if ( sepMig==null ) {
					sepMig=".";
				}	
				if ( sepDec==null ) {		
					sepDec=",";	
				}			
				
				if (s.indexOf(sepMig)==-1) {
					s=s.replace(sepMig,sepDec);
					var temp=s;
				  a = s.indexOf(sepDec);
				  if (a==-1) a=s.length;
				  if (a>=4)
				  {
				    temp = "";
				    b=s.length;
				    while (a>=4)
				    {
				      a=a-3;
				      temp = sepMig + s.substring(a,b) + temp;
				      b=a;
				    }
				    temp=s.substring(0,b) + temp;    
				  }
				}  
				  
			  if ( temp.indexOf(sepDec)!=-1 && temp.indexOf(sepDec)==(temp.length-2) )
			  {
			    temp = temp + "0";
			  }
			  if ( temp.indexOf(sepDec)==-1 )
			  {
			    temp = temp + ",00";
			  }
			  return temp;
			}  
			return "";
		}
		
		
	/**
	 * Verifica che il testo in input non contenga i seguenti tag:
	 *	-	<form
	 *	-	<input
	 *	- <script
	 *
	 * @param  sText   		Stinga con il contenuto da verificare.
	 * @return (boolean) 	truese sText contiente tag potenzialmente pericolosi, false se tutto ok.
	 */
	function isForbiddenTag( sText )
	{
		sString = sText.toUpperCase();
		if (sString.match(/<\s{0,}FORM/)) { return true; }
		if (sString.match(/<\s{0,}INPUT/)) { return true; }
		if (sString.match(/<\s{0,}SCRIPT/)) { return true; }
	
		return false;
	}

			