//
// Dichiara l'oggetto FixedDate
//
function FixedDate_getTime () {
  yy = Math.floor(this.year);
  mm = Math.floor(this.month) - 3;
  if (mm < 0) {
    yy--;
    mm += 12;
  }
  nday = yy*365 + Math.floor(yy/4) - Math.floor(yy/100) + Math.floor(yy/400);
  nday += Math.floor (mm * 30.6 + 0.4);
  return nday + Math.floor(this.date);
}

function FixedDate_toString () {
  return ""+this.year+"-"+this.month+"-"+this.date;
}
function FixedDate (yy, mm, dd) {
  this.year  = yy;
  this.month = mm;
  this.date  = dd;
  this.getTime = FixedDate_getTime;
  this.toString = FixedDate_toString;
  return this;
}

//
// Effettua il parsing delle stringhe day, month, year
// e restituisce un oggetto FixedDate.
// Se i parametri non sono validi ritorna null.
//
function parseDate (day, month, year) {

  day = ""+day;
  month = ""+month;
  year = ""+year;

  yy = 0;  mm = 0; dd = 0;

  yy = parseInt(year, 10);
  mm = parseInt(month, 10);
  dd = parseInt(day, 10);

  if (isNaN(dd) || isNaN(mm) || isNaN(yy)) {
    return null;
  }

  if (yy < 70) {
    yy += 2000;
  }
  if (yy < 100) {
    yy += 1900;
  }

  if (mm < 1 || mm > 12) {
    return null;
  }

  if (mm == 4 || mm == 6 || mm == 9 || mm == 11) {
    max = 30;
  }  else if (mm != 2) {
    max = 31;
  } else {
    max = 28;
    if ((0 == yy % 4 && 0 != yy % 100) || (0 == yy % 400)) {
      max = 29;
    }
  }

  if (dd < 1 || dd > max) {
    return null;
  }
  return new FixedDate(yy, mm, dd);
}

//
// Check whether string s is empty.
//
function isEmpty(s) {
  return ((s == null) || (s.length == 0));
}

//
// Returns true if character c is an English letter
// (A .. Z, a..z).
//
// NOTE: Need i18n version to support European characters.
// This could be tricky due to different character
// sets and orderings for various languages and platforms.
//
function isLetter (c) {
  return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) );
}

//
// Returns true if character c is an English letter
// (0..9).
//
// NOTE: Need i18n version to support European characters.
// This could be tricky due to different character
// sets and orderings for various languages and platforms.
//
function isDigit (c) {
  var digits = "0123456789";
  return  (digits.indexOf(c) >= 0) && (c.length == 1);
}

//
// Returns true is string str is a number
//
function isInteger (str) {
  for (i=0; i<str.length; i++) {
    if ( !isDigit(str.charAt(i)) ) {
      return false;
    }
  }
  return  (i > 0);
}

//
// Strips trailing spaces.
//
function TrimStringLeft (str) {
  str = str.toString();
  for (i=0; i<str.length && str.charAt(i) == ' '; i++);
  str = str.substring(i);
  return str;
}
//
// Strips trailing spaces.
//
function TrimStringRight (str) {
  str = str.toString();
  for (i=str.length-1; i>=0 && str.charAt(i) == ' '; i--);
  str = str.substring(0, i+1);
  return str;
}
//
// Strips trailing spaces.
//
function TrimString (str) {
  return TrimStringLeft(TrimStringRight(str));
}
//
// verifica se il campo contiene un codice fiscale
//
function CheckCodFis(theField) {
  var m_cVal;
  var m_cCar;
  var m_nInd;
  var m_lRetVal;
  var m_nCtrFor;
  var m_nSum = 0;
  var m_nDif = 0;

  var m_cVal = theField.value.toString().toUpperCase();
   theField.value = m_cVal;

  if (m_cVal.length != 16) {
     // alert(iCodFis);
    return false;
  }

  var m_cTabCf = new Array(27);

  m_cTabCf[1] = 1;
  m_cTabCf[2] = 0;
  m_cTabCf[3] = 5;
  m_cTabCf[4] = 7;
  m_cTabCf[5] = 9;
  m_cTabCf[6] = 13;
  m_cTabCf[7] = 15;
  m_cTabCf[8] = 17;
  m_cTabCf[9] = 19;
  m_cTabCf[10] = 21;
  m_cTabCf[11] = 2;
  m_cTabCf[12] = 4;
  m_cTabCf[13] = 18;
  m_cTabCf[14] = 20;
  m_cTabCf[15] = 11;
  m_cTabCf[16] = 3;
  m_cTabCf[17] = 6;
  m_cTabCf[18] = 8;
  m_cTabCf[19] = 12;
  m_cTabCf[20] = 14;
  m_cTabCf[21] = 16;
  m_cTabCf[22] = 10;
  m_cTabCf[23] = 22;
  m_cTabCf[24] = 25;
  m_cTabCf[25] = 24;
  m_cTabCf[26] = 23;



    for (m_nCtrFor = 1; m_nCtrFor < 16; m_nCtrFor++)
    {
         var m_cCar = m_cVal.charAt(m_nCtrFor - 1);
         var c_cCar = m_cVal.charCodeAt(m_nCtrFor - 1);

      if ((m_nCtrFor % 2) == 0) {
        if (isLetter(m_cCar) || isEmpty(m_cCar))
          m_nDif = 65;
        else
          m_nDif = 48;
        m_nSum = m_nSum + c_cCar - m_nDif
      }
      else {

        if (isLetter(m_cCar))
          m_nDif = 64;
        else
          m_nDif = 47;

        m_nInd = c_cCar - m_nDif;
        m_nSum = m_nSum + m_cTabCf[m_nInd]
      }
    }


   return ((m_nSum % 26) == (m_cVal.charCodeAt(15) - 65));
}


//
// verifica se il campo contiene una partita iva
//
function CheckPIVA(theField) {

var m_nNum
var m_nCtrFor

var m_nDif = 48
var m_nSum = 0

  var m_cVal = theField.value.toString();

  if (m_cVal.length != 11) {
     //alert(iPiva);
    return false;
  }


    for (m_nCtrFor = 1; m_nCtrFor < 11; m_nCtrFor++)
    {
         var m_cCar = m_cVal.charAt(m_nCtrFor - 1);
         var c_cCar = m_cVal.charCodeAt(m_nCtrFor - 1);
      if ((m_nCtrFor % 2) == 0) {
        m_nNum = (c_cCar - m_nDif) * 2;
        if (m_nNum > 9)
          m_nNum = (m_nNum - 9);
        m_nSum = m_nSum + m_nNum;
      }
      else {
        m_nSum = m_nSum + c_cCar - m_nDif;
      }
   }
  return  (((100 - m_nSum) % 10) == (m_cVal.charCodeAt(10) - m_nDif));
}
function FieldInfo(fieldName, errorMessage, canBeNull) {
  this.name     = fieldName;
  this.message  = errorMessage;
  this.nullable = canBeNull;
  this.value    = null;
}
function errorOnField(field, errorMessage, ok) {
  if ( ! ok ) {
    if (field != null && field.focus != null) {
      field.focus();
    }
    alert(errorMessage);
  }
  return ok;
}
function checkIntegerField(form, fieldInfo) {
  var canBeNull = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].value != null) {
    form[fieldInfo.name].value = TrimString(form[fieldInfo.name].value);
    if ( form[fieldInfo.name].value.length > 0 ) {
      canBeNull = isInteger(form[fieldInfo.name].value);
      if (canBeNull) {
        fieldInfo.value = form[fieldInfo.name].value;
      }
    }
  }
  // Quando arrivo qua, canBeNull vale true se
  // a. il campo era vuoto e canBeNull valeva true all'inizio, oppure
  // b. il campo non era vuoto e il valore era un integer.
  return errorOnField(form[fieldInfo.name], fieldInfo.message, canBeNull);
}
function checkFixedLengthField(form, fieldInfo, length) {
  var canBeNull = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].value != null) {
    form[fieldInfo.name].value = TrimString(form[fieldInfo.name].value).toUpperCase();
    if ( form[fieldInfo.name].value.length > 0 ) {
      canBeNull = (form[fieldInfo.name].value.length == length);
      if (canBeNull) {
        fieldInfo.value = form[fieldInfo.name].value;
      }
    }
  }
  return errorOnField(form[fieldInfo.name], fieldInfo.message, canBeNull);
}
function checkUpperCaseField(form, fieldInfo) {
  var canBeNull = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].value != null) {
    form[fieldInfo.name].value = TrimString(form[fieldInfo.name].value).toUpperCase();
    if (form[fieldInfo.name].value.length > 0) {
      canBeNull = true;
      fieldInfo.value = form[fieldInfo.name].value;
    }
  }
  return errorOnField(form[fieldInfo.name], fieldInfo.message, canBeNull);
}
function checkField(form, fieldInfo) {
  var canBeNull = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].value != null) {
    form[fieldInfo.name].value = TrimString(form[fieldInfo.name].value);
    if (form[fieldInfo.name].value.length > 0) {
      canBeNull = true;
      fieldInfo.value = form[fieldInfo.name].value;
    }
  }
  return errorOnField(form[fieldInfo.name], fieldInfo.message, canBeNull);
}
function checkDateField(form, fieldInfo, length) {
  var canBeNull = fieldInfo.nullable;
  var f_dd = fieldInfo.name + "_dd";
  var f_mm = fieldInfo.name + "_mm";
  var f_yy = fieldInfo.name + "_yy";
  if( form != null && form[f_dd] != null && form[f_dd].value != null && form[f_mm] != null && form[f_mm].value != null && form[f_yy] != null && form[f_yy].value != null ) {
    form[f_dd].value = TrimString(form[f_dd].value);
    form[f_mm].value = TrimString(form[f_mm].value);
    form[f_yy].value = TrimString(form[f_yy].value);
    //
    if ( form[f_dd].value.length > 0 || form[f_mm].value.length > 0 || form[f_yy].value.length > 0 ) {
      // la funzione parseDate restisuisce null se la data non è valida.
      fieldInfo.value = parseDate(form[f_dd].value, form[f_mm].value, form[f_yy].value);
      canBeNull = (fieldInfo.value != null);
      if (fieldInfo.value != null) {
        form[f_dd].value = fieldInfo.value.date;
        form[f_mm].value = fieldInfo.value.month;
        form[f_yy].value = fieldInfo.value.year;
      }
    }
  }
  // Quando arrivo qua, canBeNull vale true se
  // a. il campo era vuoto e canBeNull valeva true all'inizio, oppure
  // b. il campo non era vuoto e il valore era una data.
  return errorOnField(form[f_dd], fieldInfo.message, canBeNull);
}
function checkCFPIVAField(form, fieldInfo, length) {
  var valid = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].value != null) {
    form[fieldInfo.name].value = TrimString(form[fieldInfo.name].value).toUpperCase();
    if (form[fieldInfo.name].value.length > 0) {
      if ((valid = CheckPIVA(form[fieldInfo.name]) || CheckCodFis(form[fieldInfo.name]))) {
        fieldInfo.value = form[fieldInfo.name].value;
      }
    }
  }
  return errorOnField(form[fieldInfo.name], fieldInfo.message, valid);
}
function checkCheckbox(form, fieldInfo) {
  var valid = fieldInfo.nullable;
  if( form != null && form[fieldInfo.name] != null && form[fieldInfo.name].checked != null) {
    fieldInfo.value = form[fieldInfo.name].checked;
    valid = true;
  }
  return errorOnField(form[fieldInfo.name], fieldInfo.message, valid);
}




// indica se il valore è un indirizzo di email valido
function isEmailAddress(inputVal) {
    var ind_punto = 0;
    var ind_at    = 0;

    inputStr = inputVal.toString();

    for (var i = 0; i < inputStr.length; i++) {
        var oneChar = inputStr.charAt(i)

        if (oneChar == "."){
          ind_punto = i;
        }

        if (oneChar == "@"){
          ind_at = i;
        }
    }

    if (((ind_at == 0) ||(ind_punto == 0)) || (ind_at > ind_punto) || (ind_punto <= ind_at+1)){
      return false
    }
	postfix= inputStr.substring(ind_punto, inputStr.length)
	if(postfix==".com" || postfix==".net" || postfix==".org" || postfix==".edu" || postfix==".gov" || postfix==".mil" || postfix==".it"){
		return true;
	}
	else{
		return false;
	}

    return true
}
// indica se il valore è un numero di telefono valido
function isTelephoneNumber(inputVal) {

    inputStr = inputVal.toString()

    /*if ((inputStr.charAt(0) != "+") && (inputStr.charAt(0) != "0")){
      return false
    }*/

    if (inputStr.length < 7) {
      return false
    }

    for (var i = 1; i < inputStr.length; i++) {
        var oneChar = inputStr.charAt(i)
        if (oneChar < "0" || oneChar > "9") {
            return false
        }
    }
    return true
}

function internationalize(url) {
    var w = screen.availWidth - 10;
    var h = screen.availHeight - 30;
    newWindow= window.open(url, "I18INFO", "top=0,left=0, width=" + w + ",height=" + h + ",scrollbars=yes,toolbar=no,menubar=no");
    newWindow.focus();
}
var IE = "";
var NS = "NS";
function getBrowser(){
	if(navigator.appName == "Netscape" || document.layers){
		return NS;
	}
	else{
		return IE;
	}
}
function openHelp(appName){
	var w = 600;
	var h = 500;
	var left = (screen.availWidth - w) / 2;
	var top = (screen.availHeight - h) / 2;
	loc = parent.doc.location;
	params = "context=" + loc.pathname.replace(appName, "") + escape(loc.search);
	helphref = "help.do?" + params;
	popup = window.open(helphref, "popup", "scrollbars=yes,toolbar=no,menubar=no,resizable=yes");
	popup.focus();
}