/* Elimina i blanks iniziali e finali da una stringa */
function trim(text) {
   return text.replace(/^\s+|\s+$/, "");
}

/* Verifica che una stringa rappresenti un intero [-]?[0-9]+ */
function isInteger(value,
                   zeroAdmitted) {
   if (value.search(/^[\-]?\d+$/) == -1)
      return false;

   if (!zeroAdmitted && Number(value) == 0)
      return false;

   return true;
}

/* Verifica che una stringa rappresenti un decimale [-]?[0-9]*([.][0-9]+)? */
function isDecimal(value,
                   zeroAdmitted) {
   if (value.search(/^[\-]?[\.]\d+$/) == -1 &&
       value.search(/^[\-]?\d+([\.]\d+)?$/) == -1)
      return false;

   if (!zeroAdmitted && Number(value) == 0)
      return false;

   return true;
}

/* Verifica che una stringa rappresenti un intero positivo [0-9]+ */
function isPositiveInteger(value,
                           zeroAdmitted) {
   if (value.search(/^\d+$/) == -1)
      return false;

   if (!zeroAdmitted && Number(value) == 0)
      return false;

   return true;
}

/* Verifica che una stringa rappresenti un decimale positivo [0-9]*([.][0-9]+)? */
function isPositiveDecimal(value,
                           zeroAdmitted) {
   if (value.search(/^\d*([\.]\d+)?$/) == -1)
      return false;

   if (!zeroAdmitted && Number(value) == 0)
      return false;

   return true;
}

/* Verifica che il decimale specificato sia valido (ossia presenti al piu' i cifre intere e al piu' d cifre decimali) */
function isValidDecimal(number, i, d) {
   var pattern = "^[\\-]?\\d{0," + i + "}([\\.]\\d{0," + d + "})?$";
   var re = new RegExp(pattern);
   return re.test(number);
}

/* Verifica che il decimale specificato sia valido e positivo */
function isValidPositiveDecimal(number, i, d) {
   var pattern = "^\\d{0," + i + "}([\\.]\\d{0," + d + "})?$";
   var re = new RegExp(pattern);
   return re.test(number);
}

/* Verifica che una stringa rappresenti una data corretta */
function isDateField(dateField) {
   /* Anno di pivoting */
   var pivotYear = 40;

   /* Controllo formato stringa */
   if (dateField.value.search(/^\d{1,2}[\/\-\.]\d{1,2}[\/\-\.]\d{2,4}$/) == -1)
      return false;

   /* Suddivisione campi data */
   var fields = dateField.value.split(/[\/\-\.]/);

   /* Normalizzazione giorno */
   if (fields[0].length == 1)
      fields[0] = "0" + fields[0];

   /* Normalizzazione mese */
   if (fields[1].length == 1)
      fields[1] = "0" + fields[1];

   /* Normalizzazione anno */
   switch (fields[2].length) {
      case 2:
         if (fields[2] <= pivotYear)
            fields[2] = new String(new Date().getFullYear()).substr(0, 2) + fields[2];
         else
            fields[2] = new String(new Date().getFullYear() - 100).substr(0, 2) + fields[2];
         break;

      case 3:
         fields[2] = new String(new Date().getFullYear() - 1000).substr(0, 1) + fields[2];
   }

   /* Merge campi */
   dateField.value = fields.join("/");

   /* Controlla correttezza formale data */
   if (!isDate(fields[0], fields[1], fields[2]))
      return false;

   return true;
}

function isDate(day,
                month,
                year) {
   /* Verifica range giorno */
   if (day < 1 || day > 31)
      return false;

   /* Verifica range mese */
   if (month < 1 || month > 12)
      return false;

   /*
      Verifica range anno

      Controlli se anno bisestile.
      Eccezioni:
      1753, entrata in vigore del calendario gregoriano
             in tutti i paesi europei;
      4902, anno bisestile anche se non dovrebbe esserlo.
   */
   if (year < 1753 || year > 4902)
      return false;

   switch (Number(month)) {
      case 2:
          if (day > 29)
             return false;

          if (day == 29)
             if (year % 4 != 0 || (year %100 == 0 && year %400 !=0))
                return false;

          break;

      case 4:
      case 6:
      case 9:
      case 11:
          if (day>30)
             return false;
   }

   return true;
}

/* Verifica che una stringa rappresenti un orario corretto */
function isTimeField(timeField) {
   /* Controllo formato stringa */
   if (timeField.value.search(/^\d{1,2}([\:\.]\d{2})?$/) == -1)
      return false;

   /* Suddivisione campi orario */
   var fields = timeField.value.split(/[\:\.]/);

   /* Normalizzazione ora */
   if (fields[0].length == 1)
      fields[0] = "0" + fields[0];

   /* Normalizzazione minuti */
   if (fields.length == 1)
      fields[1] = "00";

   /* Merge campi */
   timeField.value = fields.join(":");

   /* Controlla correttezza formale orario */
   if (fields[0] > 23)
      return false;

   if (fields[1] > 59)
      return false;

   return true;
}

/* Verifica che l'indirizzo e-mail specificato sia formalmente corretto */
function isValidEmailAddress(address) {
  var emailRE = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

  if (trim(address).length == "")
    return false;

  if (!emailRE.test(address))
    return false;

  return true;
}

/* Confronto tra due date */
function compareDate(date1,
                     date2,
                     compareTime) {
   var dapp1, dapp2 = null;

   if (compareTime) {
     dapp1 = new Date(date1.getFullYear() ,date1.getMonth(), date1.getDate(), date1.getHours(), date1.getMinutes(), date1.getSeconds(), date1.getMilliseconds());
     dapp2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate(), date2.getHours(), date2.getMinutes(), date2.getSeconds(), date2.getMilliseconds());
   } else {
     dapp1 = new Date(date1.getFullYear() ,date1.getMonth(), date1.getDate(), 0, 0, 0, 0);
     dapp2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate(), 0, 0, 0, 0);
   }

   if (dapp1.getTime() < dapp2.getTime())
      return -1;

   if (dapp1.getTime() > dapp2.getTime())
      return 1;

   return 0;
}

/* Confronto tra due orari (in formato HH:MM) */
function compareTime(time1,
                     time2) {
   var tapp1 = new Date(0, 0, 0, Number(time1.substr(0, 2)), Number(time1.substr(3, 2)), 0, 0);
   var tapp2 = new Date(0, 0, 0, Number(time2.substr(0, 2)), Number(time2.substr(3, 2)), 0, 0);

   if (tapp1.getTime() < tapp2.getTime())
      return -1;

   if (tapp1.getTime() > tapp2.getTime())
      return 1;

   return 0;
}

/* Consente la sola immissione di date [0-9][-./] */
function requestDateChar(event) {
   if (!event)
      var event = window.event;

   if (event.keyCode)
      code = event.keyCode;
   else if (event.which)
      code = event.which;

   if (!isArrowKey(event) && code >= 32 &&
       (code < 45 || code > 57)) {
      cancelEvent(event);
   }

   return;
}

/* Ritorna se il carattere passato come parametro e' un meta-carattere */
function isMetaKey(event) {
   return (event.altKey || event.ctrlKey || event.shiftKey || event.metaKey);
}

/* Ritorna se il carattere passato come parametro e' una freccia direzionale */
function isArrowKey(event) {
   if (!event)
      var event = window.event;

   if (event.keyCode)
      code = event.keyCode;
   else if (event.which)
      code = event.which;

   if (!isMetaKey(event) && code >= 37 && code <= 40)
     return true;

   return false;
}

/* Cancellazione evento corrente */
function cancelEvent(event) {
  if (event.preventDefault)   // NS
     event.preventDefault();
  else                        // IE
     event.keyCode = 0;
}