   function padout(number) { return (number < 10) ? '0' + (number*1) : number; }

   function pad(number,length)
   {
      var str = '' + number;
      while (str.length < length)
         str = '0' + str;
      return str;
   }

   function checkInt(e) {
      var re= /^[+-]?\d*$/; // segno opzionale + cifre
      var num, min,max,v;
      if ((typeof e) =='object') {
         num = e.value;
         if (e.min ) 
            min=e.min;
         if (e.minint ) 
            min=e.minint;
         if (e.max ) 
           max=e.max;
         if (e.maxint ) 
           max=e.maxint;
         if (arguments.length > 1) 
           min = arguments[1];
         if (arguments.length > 2) 
           max = arguments[2];
      } else {
         num = e ;
         if (arguments.length > 1) 
           min = arguments[1];
         if (arguments.length > 2) 
           max = arguments[2];
      }
      if (num.search(re) == -1)
         return false;
      v= parseInt(num, 10);
      if (isNaN(v) ||
         ((min != null) && (v < min)) ||
         ((max != null) && (v > max)))
      {
         return false; }
      if ((typeof e) =='object') 
        e.value = v;

      return true;
      
   }
   
   function checkNum(e) {
      var re= /^[+-]?\d*[.,]?\d*$/; // segno opzionale + cifre separatore dec e altre cifre
      var num,min,max,x,v;
      if ((typeof e) =='object') {
         num = e.value;
         if (e.min ) 
            min=e.min;
         if (e.max ) 
           max=e.max;
         if (arguments.length > 1) 
           min = arguments[1];
         if (arguments.length > 2) 
           max = arguments[2];
      } else {
         num = e ;
         if (arguments.length > 1) 
           min = arguments[1];
         if (arguments.length > 2) 
           max = arguments[2];
      }
      if (num.search(re) == -1)
         return false;
      x= num.replace(/,/,'.');
      v= parseFloat(x);
      if (isNaN(v) ||
         ((min != null) && (v < min)) ||
         ((max != null) && (v > max)))
      {
         return false; }
      if ((typeof e) =='object') 
        e.value = v;

      return v;
      
   }
   
   function okRegExp (testo, rExpr) {
   // controlla se la stringa in testo rispetta
   // l'espressione regolare in rExpr
   // dopo rExpr si possono aggiungere i modificatori 'g', 'i'
   // per global e ignore case
   var re;
   if (arguments.length > 2) {
     re = new RegExp(rExpr, arguments[2]) ;
   } else {
     re = new RegExp(rExpr)}
   return (testo.search(rExpr) >= 0);
   }
 
   function isDate (day,month,year) {
   // checks if date passed is valid
   // will accept dates in following format:
   // isDate(dd,mm,ccyy), or
   // isDate(dd,mm) - which defaults to the current year, or
   // isDate(dd) - which defaults to the current month and year.
   // Note, if passed the month must be between 1 and 12, and the
   // year in ccyy format.
 
       var today = new Date();
       year = ((!year) ? today.getFullYear():year);
       month = ((!month) ? today.getMonth():month-1);
       if (!day) return false
       var test = new Date(year,month,day);
       if ( (test.getFullYear() == year) &&
          (month == test.getMonth()) &&
          (day == test.getDate()) )
           return true;
       else
           return false
   }
 
   function checkDate (data)
   {
   // Controlla che una data passata come stringa od oggetto
   //  con il formato gg/mm/aaaa o ggmmaaaa sia valida ritorna true x data Ok
   // P.S. il separatore puo' essere anche "-" o "."
 
   var redata= /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{4})$/; // anno a 4 cifre
   var redata1= /^(\d{2})(\d{2})(\d{4})$/; // GGMMAAAA anno a 4 cifre
   var redata2= /^(\d{4})[\/\.-](\d{1,2})[\/\.-](\d{1,2})$/; // anno a 4 cifre aaaa-mm-dd

   var dt = (((typeof data) == 'object') ? data.value : data );
   var ok= dt.match(redata);
   if (ok == null)
   {
       ok=dt.match(redata1);
   }
     if (ok == null)
   {
       ok=dt.match(redata2);
	   				oktemp=array(ok[3],ok[2],ok[1]);
				ok=oktemp;

   }
   if ((ok == null) || ! isDate(ok[1],ok[2],ok[3])) 
       return false;
   if ((typeof data) == 'object')
       data.value = ok[1] + '/' + ok[2] + '/' + ok[3];
   return true;
   }

   function makeDate (data)
   {
   // Controlla che una data passata come stringa o oggetto text di form
   //  con il formato gg/mm/aaaa  o ggmmaaaa sia valida e se lo e' ritorna
   //  un oggetto Date con con qella data altrimenti ritorna null
   // P.S. il separatore puo' essere anche "-" o "."
 
   var redata= /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{4})$/; // anno a 4 cifre
   var redata1= /^(\d{2})(\d{2})(\d{4})$/; // GGMMAAAA anno a 4 cifre
   var redata2= /^(\d{4})[\/\.-](\d{1,2})[\/\.-](\d{1,2})$/; // anno a 4 cifre aaaa-mm-dd

   var dt = (((typeof data) == 'object') ? data.value : data );
   var ok= dt.match(redata);
   if (ok == null)
   {
       ok=dt.match(redata1);
   }
      if (ok == null)
   {
       ok=dt.match(redata2);
	   	oktemp=array(ok[3],ok[2],ok[1]);
		ok=oktemp;

   }
   if ((ok == null) || ! isDate(ok[1],ok[2],ok[3])) 
       return null;
   if ((typeof data) == 'object')
       data.value = ok[1] + '/' + ok[2] + '/' + ok[3];
   return new Date(ok[3],ok[2]-1,ok[1]);
   }

   function formatDate (data) {
   // Formatta un oggetto data in gg/mm/aaaa
           return padout(data.getDate()) + '/' + padout((data.getMonth() + 1))  + '/' + data.getFullYear();
   }

   function dateDiff (d1, d2)
   {
   // Effettua la differenza tra i due oggetti Date passati e restituisce 
   //  il numero di giorni per cui differiscono (d1 - d2)
     // tronco al giorno
     d1.setHours(0)
     d1.setMinutes(0)
     d1.setSeconds(0)
     d1.setMilliseconds(0)
     d2.setHours(0)
     d2.setMinutes(0)
     d2.setSeconds(0)
     d2.setMilliseconds(0)
     var diff=d1.getTime() - d2.getTime()
     diff = Math.floor(diff / (1000 * 60 * 60 * 24) );
 
     return diff;
   }

   function dateDiffText (d1, d2)
   {
   // Effettua la differenza tra i due oggetti date passati come campi form tipo text o stringhe
   // (in forma gg/mm/aaaa) e restituisce   il numero di giorni per cui differiscono (d1 - d2)
   // le date devono essere valide altrimenti risultato imprevedibile. 
   // se una delle 2 date è vuota restituisce 0
     var redata= /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{4})$/; // anno a 4 cifre
     var redata1= /^(\d{2})(\d{2})(\d{4})$/; // GGMMAAAA anno a 4 cifre
	    var redata2= /^(\d{4})[\/\.-](\d{1,2})[\/\.-](\d{1,2})$/; // anno a 4 cifre aaaa-mm-dd

     var data1 = null;
     var data2 = null;
     var time1 = 0;
     var time2 = 0;
     
     var dt1 = (((typeof d1) == 'object') ? d1.value : d1 );
     var dt2 = (((typeof d2) == 'object') ? d2.value : d2 );

     var ok= dt1.match(redata);
     if (ok == null)
     {
       ok=dt1.match(redata1);
     }
	  if (ok == null)
   {
       ok=dt1.match(redata2);
				oktemp=array(ok[3],ok[2],ok[1]);
				ok=oktemp;

   }
     if ((ok != null) &&  isDate(ok[1],ok[2],ok[3])) 
       data1 =  new Date(ok[3],ok[2]-1,ok[1]);
     else
       return 0;
       
     ok= dt2.match(redata);
     if (ok == null)
     {
       ok=dt2.match(redata1);
     }
	if (ok == null)
   {
       ok=dt2.match(redata2);
   }

     if ((ok != null) &&  isDate(ok[1],ok[2],ok[3])) 
       data2 =  new Date(ok[3],ok[2]-1,ok[1]);
     else
       return 0;
    
    if (data1 != null)
        time1 = data1.getTime();
    if (data2 != null)
        time2 = data2.getTime();
       
     var diff= time1 -time2
     diff = Math.floor(diff / (1000 * 60 * 60 * 24) );
 
     return diff;
   }

   function isOra (hh,mm) {
   // checks if ora passed is ok
   // will accept ora passed in following format:
   // isOra(hh,mm) (hh tra 0 e 23 e mm tra 0 e 59)
       if (! checkInt(hh,0,23)) return false
       if (! checkInt(mm,0,59)) return false
       return true;
   }
 
   function checkOra (ora)
   {
   // Controlla che un orario passato come stringa od oggetto
   //  con il formato hh:mm sia valido ritorna true x ora Ok
 
   var reora= /^(\d{1,2})[:](\d{1,2})$/; // anno a 4 cifre
   var reora1= /^(\d{2})(\d{2})$/; // HHMM
   var hhmm = (((typeof ora) == 'object') ? ora.value : ora );
   var ok= hhmm.match(reora);
   if (ok == null)
   {
       ok=hhmm.match(reora1);
   }
   if ((ok == null) || ! isOra(ok[1],ok[2])) 
       return false;
   if ((typeof ora) == 'object')
       ora.value = ok[1] + ':' + ok[2];
   return true;
   }

   function formatOra (ora) {
   // Formatta un numero intero passato come ora e minuto (p.e. 902 sta per 09:02) in HH:MM
           return padout(Math.floor(ora / 100)) + ':' + padout(ora % 100);
   }

   function isValidEmail(str) {
      var filter=/^(\w+(\.\w+)*)@((\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(\.[a-z]{2})?)$/i
      return  (filter.test(str));
   /*
      var i = str.indexOf("@");
      if ( i > 0) {
         var dom = str.substr(i+1);
	 return (dom.indexOf(".") > 0);
      } else {
        return false;
      }
   */
   }
    
   function isBlank(s)
   {
      for (var i=0; i <s.length; i++)
      {
         var c=s.charAt(i);
         if ((c!= ' ') && (c!='\n') && (c!='\t')) return false;
      }
      return true;
   }

   function verify(f)
   {
      // espressione regolare per le date
      // anno da 2 a 4 cifre var redata= /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{2,4})$/;
      var redata= /^(\d{1,2})[\/\.-](\d{1,2})[\/\.-](\d{4})$/; // anno a 4 cifre
      var redata1= /^(\d{2})(\d{2})(\d{4})$/; // GGMMAAAA anno a 4 cifre
	  var redata2= /^(\d{4})[\/\.-](\d{1,2})[\/\.-](\d{1,2})$/; // anno a 4 cifre aaaa-mm-dd

      var reora= /^(\d{1,2})[:](\d{1,2})$/; // anno a 4 cifre
      var reora1= /^(\d{2})(\d{2})$/; // HHMM
      var msg;
      var empty_fields='';
      var errors='';
      var v, re, x;
      var checkSelect = false;

      if (arguments.length > 1)
        checkSelect = arguments[1];

      for(var i=0; i < f.length; i++)
      {
         var e=f.elements[i];
         var displayName = (e.displayName ? e.displayName : e.name);
         //if ( checkSelect && (e.type.indexOf('select') == 0) ) {
         if ( checkSelect && (e.type == 'select-one') ) {
            if ( !e.optional && ( (e.selectedIndex < 0 ) || (e.options[e.selectedIndex].value==null) ||
	         (e.options[e.selectedIndex].value=='') || isBlank(e.options[e.selectedIndex].value)) )
            {
               empty_fields += '\n         ' + displayName;
               e.focus();
               continue;
            }
	 }
         // if ( ((e.type=='text') || (e.type=='textarea')) && !e.optional)
         if ( ((e.type=='text') || (e.type=='textarea') || (e.type=='password')) )
         {
            if ( ((e.value==null) || (e.value=='') || isBlank(e.value))  && e.optional)
                continue;
            if ( ((e.value==null) || (e.value=='') || isBlank(e.value))  && !e.optional)
            {
               empty_fields += '\n         ' + displayName;
               e.focus();
               continue;
            }
            //Controlla la lunghezza del campo
            if ( ((e.minlen != null) && (e.value.length < e.minlen)) ||
                     ((e.maxlen != null) && (e.value.length > e.maxlen))  )
            {
               errors += '-Il campo ' + displayName + ' deve avere ';
               if (e.minlen != null)
                  errors += 'almeno ' + e.minlen + ' caratteri ';
               if (e.maxlen != null && e.minlen != null)
                  errors += ' e al massimo ' + e.maxlen + ' caratteri';
               else if(e.maxlen != null)
                  errors += 'al massimo ' + e.maxlen + ' caratteri';
               errors += '.\n';
               e.focus();
               //continue;
               continue;
            }
            
            //Controlla se è un indirizzo E-mail
            if ( (e.email) && ! isBlank(e.value) )
            {
               if (! isValidEmail(e.value)) {
                  errors += '-Il campo ' + displayName + ' non è un indirizzo E-mail valido!';
                  errors += '.\n';
                  e.focus();
                  continue;
	       }
            }
            
            // trasforma in maiuscolo/minuscolo
            if ((e.ucase != null) && (e.ucase) ) {
                e.value = e.value.toUpperCase()
            } else {
                if ((e.lcase != null) && (e.lcase) ) {
                    e.value = e.value.toLowerCase()
                }
            }
            
            //Controlla i campi numerici interi
            if ( (e.numint || e.numericint || (e.minint !=null) || (e.maxint!=null)) && ! isBlank(e.value) )
            {
               x= e.value;
               v= parseInt(x,10);
               if (isNaN(v) || ( v != x ) ||
                        ((e.minint != null) && (v < e.minint)) ||
                        ((e.maxint != null) && (v > e.maxint)))
               {
                  errors += '-Il campo ' + displayName + ' deve essere un numero intero';
                  if (e.minint != null)
                     errors += ' maggiore o uguale di ' + e.minint;
                  if (e.maxint != null && e.minint != null)
                     errors += ' e minore o uguale di ' + e.maxint;
                  else if(e.maxint != null)
                     errors += ' minore o uguale di ' + e.maxint;
                  errors += '.\n';
                  e.focus();
               } else {
                  e.value = v
               }
               continue;
            }

            //Controlla i campi numerici non interi
            if ( (e.numero || e.numeric || (e.min !=null) || (e.max!=null)) && ! isBlank(e.value) )
            {
               x= e.value.replace(/,/,'.');
               //v= parseFloat(e.value);
               v= parseFloat(x);
               if (isNaN(v) || ( v != x ) ||
                        ((e.min != null) && (v < e.min)) ||
                        ((e.max != null) && (v > e.max)))
               {
                  errors += '-Il campo ' + displayName + ' deve essere un numero';
                  if (e.min != null)
                     errors += ' maggiore o uguale di ' + e.min;
                  if (e.max != null && e.min != null)
                     errors += ' e minore o uguale di ' + e.max;
                  else if(e.max != null)
                     errors += ' minore o uguale di ' + e.max;
                  errors += '.\n';
                  e.focus();
               } else {
                  e.value = v
               }
               continue;
            }

            //Controlla espressione regolare
            if ((e.regExp != null) && (e.regExp) ) {
                if ((typeof e.regExp) =='function') {
                    re = e.regExp;
                } else {
                    if ((e.regFlag != null) && (e.regFlag) ) {
                        re = new RegExp(e.regExp, e.regFlag)
                    } else {
                        re = new RegExp(e.regExp)
                    }
                }
                if (! e.value.match(re) ) {
                    errors += '-Il campo ' + displayName + ' non corrisponde al formato ' + re.toString()+'.\n';
                    e.focus();
                    continue;
                }
            }
            
            //Controlla i campi data (giorno/mese/anno o ggmmaaaa)
            if ( (e.data || (e.mindat !=null) || (e.maxdat!=null)) && ! isBlank(e.value) )
            {
               v= e.value;
               var ok= v.match(redata);
               if (ok == null)
               {
                  ok=v.match(redata1);
               }
			    if (ok == null)
               {
                  ok=v.match(redata2);
				oktemp=array(ok[3],ok[2],ok[1]);
				ok=oktemp;
               }
               if ((ok == null) || ! isDate(ok[1],ok[2],ok[3])) 
               {
                  errors += '-Il campo ' + displayName + ' deve essere una data in formato gg/mm/aaaa o ggmmaaaa o aaaa-mm-gg.\n';
                  e.focus();
               } else {
                  var d = new Date(ok[3],ok[2]-1,ok[1]);
                  if (((e.mindat != null) && (d < e.mindat)) ||
                      ((e.maxdat != null) && (d > e.maxdat))) {
                     errors += '-Il campo ' + displayName + ' deve essere una data in formato gg/mm/aaaa o ggmmaaa';
                     if (e.mindat != null)
                        errors += ' maggiore o uguale di ' + formatDate(e.mindat);
                     if (e.maxdat != null && e.mindat != null)
                        errors += ' e minore o uguale di ' + formatDate(e.maxdat);
                     else if(e.maxdat != null)
                        errors += ' minore o uguale di ' + formatDate(e.maxdat);
                     errors += '.\n';
                     e.focus();
                  } else {
                     e.value = padout(ok[1]) + '/' + padout(ok[2]) + '/' + ok[3];
                  }
               }
            }
            
            //Controlla i campi ora (hh:mm o hhmm)
            if ( (e.ora || (e.minora !=null) || (e.maxora!=null)) && ! isBlank(e.value) )
            {
               v= e.value;
               var ok= v.match(reora);
               if (ok == null)
               {
                  ok=v.match(reora1);
               }
               if ((ok == null) || ! isOra(ok[1],ok[2])) 
               {
                  errors += '-Il campo ' + displayName + ' deve essere un orario in formato hh:mm o hhmm.\n';
                  e.focus();
               } else {
                  var d = (ok[1] * 100) + (ok[2] * 1);
                  if (((e.minora != null) && (d < e.minora)) ||
                      ((e.maxora != null) && (d > e.maxora))) {
                     errors += '-Il campo ' + displayName + ' deve essere un orario in formato hh:mm o hhmm';
                     if (e.minora != null)
                        errors += ' maggiore o uguale di ' + formatOra(e.minora);
                     if (e.maxora != null && e.minora != null)
                        errors += ' e minore o uguale di ' + formatOra(e.maxora);
                     else if(e.maxora != null)
                        errors += ' minore o uguale di ' + formatOra(e.maxora);
                     errors += '.\n';
                     e.focus();
                  } else {
                     e.value = formatOra(d);
                  }
               }
            }
         }
      }

      //Visualizza i messaggi
      if (!empty_fields && !errors) return true;
      
      msg =  '_________________________________________\n\n';
      msg += 'Sono stati riscontrati i seguenti errori:\n';
      msg += 'Correggere e riprovare.\n';
      msg += '_________________________________________\n\n';      
      if (empty_fields)
      {
         msg += '- I seguenti campi risultano vuoti:' + empty_fields + "\n";
         if (errors) msg += '\n';
      }
      msg += errors;
      alert (msg);
      return false;
   }

