/*
funzioni di test:

boolean isNull(field) : true se il campo e' vuoto
boolean isTooLong(field, size) : true se il campo e' vuoto
boolean isNullSel(field) : true se il campo select e' vuoto
boolean isNullCheck(field) : true se la checkBox non e'selezionata
boolean isNumber(field) : true se il campo e' un numero float o e' null
boolean isInt(field) : true se il campo e' un numero intero  o e' null
boolean isInRange(field, minVal, maxVal) : true se il campo e' un numero compreso nel range indicato o e' null
boolean isEmail(field) : true se il campo e' un email o e' null
boolean isEuroDate(field) : true se il campo e' una data nel formato dd/mm/yyyy o dd/mm/yy o e' null
boolean isPIVA(field): true se il campo e' vuoto o è una partita IVA formalmente valido
boolean isCF(field): true se il campo e' vuoto o è un codice fiscale formalmente valido

funzioni generiche:

void setLen (field, textBox) :inserisce in textBox la lunghezza di field
updateTextAreaLen() : cerca tutte le textarea nella form ed esegue il metodo e' associato a onkeypress
                      e da usare assieme a setLen. il metodo deve essere chiamato in fondo alla form
boolean fileNameTooLong(field, maxLength) return true if length of file in field is grester than maxLength


Esempio:

<script language="JavaScript">
function validateForm(){
  errore='i seguenti dati sono obbligatori:\n';
  ok=true;
  if (isNull('campo1'))      {errore+='. il campo1\n'; ok=false};
  if (isNullSel('campo2'))   {errore+='. campo2\n'; ok=false};
  if (isNullCheck('campo3')) {errore+='. selezionate il flag campo 3\n'; ok=false};
  if (! ok) alert (errore);
  return ok;
}
</script>
<form action="send.php" method="post" onSubmit="return validateForm()">
  <input type="text" name="campo1" size="35">
  <select name="campo2"><option value="">scegli una opzione</option> ... </select>
  <input type="checkbox" name="campo3" value="ok">
  ...
</form>
<script language="JavaScript">
// solo se si e' usato setLen
updateTextAreaLen()
</script>
*/

function isNull(field){
  return (document.forms[0].elements[field].value=='');
}
function isTooLong(field,size){
  return (document.forms[0].elements[field].value.length >size);
}
function isNullSel(field){
  i = eval(document.forms[0].elements[field]).selectedIndex;
  return (eval(document.forms[0].elements[field]).options[i].value=='');
}
function isNullCheck(field){
  return (!document.forms[0].elements[field].checked);
}

function isNumber(field){
  return (checkNumber(document.forms[0].elements[field].value));
}

function isInt(field){
  return (checkInteger(document.forms[0].elements[field].value));
}

function isInRange(field, minVal, maxVal){
  return (checkRange(document.forms[0].elements[field].value, minVal, maxVal));
}

function passwd(nomeform, campo1, campo2){
	  return (eval(nomeform+'.'+campo1).value==eval(nomeform+'.'+campo2).value);
}

function isEmail(field) {
  Ctrl = document.forms[0].elements[field].value;
  p=Ctrl.indexOf('@');
  // l'email deve contenere il carattere @, ma non come primo o come ultimo
  if ( (p <= 1) || (p==Ctrl.length)) return (false);
  //dato che dopo il carattere @ ci possono essere n livelli di dominio analizziamo il tld da destra
  p1=Ctrl.lastIndexOf('.');
  // il punto non puo' trovarsi dopo @, o negli ultimi 2 caratteri (il TLD deve essere di almeno 2 chars)
  if ( (p1 <= p+1) || (p1>=Ctrl.length-2)) return (false);
  // il second level domain deve essere di almeno 2 caratteri
  // nota: se e' un dominio di terzo livello questo controllo non funziona
  if (Ctrl.substring(p,p1).length<3) return (false);
  return (true);
}

function isPIVA(field)
{
  pi=document.forms[0].elements[field].value;
	if( pi == '' )  return true;//return '';
	if( pi.length != 11 )
    return false;
		//return "La lunghezza della partita IVA non è\n" +	"corretta: la partita IVA dovrebbe essere lunga\n" + "esattamente 11 caratteri.\n";
	validi = "0123456789";
	for( i = 0; i < 11; i++ ){
		if( validi.indexOf( pi.charAt(i) ) == -1 )
      return false;
			//return "La partita IVA contiene un carattere non valido `" + pi.charAt(i) + "'.\nI caratteri validi sono le cifre.\n";
      
	}
	s = 0;
	for( i = 0; i <= 9; i += 2 )
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);
	for( i = 1; i <= 9; i += 2 ){
		c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
		if( c > 9 )  c = c - 9;
		s += c;
	}
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
    return false;
		//return "La partita IVA non è valida:\n" +	"il codice di controllo non corrisponde.\n";
	return true;
  //return '';
}

function isCF(field)
{
  cf=document.forms[0].elements[field].value;
	var validi, i, s, set1, set2, setpari, setdisp;
	if( cf == '' )  return true; //return '';
	cf = cf.toUpperCase();
	if( cf.length != 16 ) return false;
		//return "La lunghezza del codice fiscale non è\n"+"corretta: il codice fiscale dovrebbe essere lungo\n"+"esattamente 16 caratteri.\n";
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ){
		if( validi.indexOf( cf.charAt(i) ) == -1 ) return false;
      //return "Il codice fiscale contiene un carattere non valido `" +	cf.charAt(i) +	"'.\nI caratteri validi sono le lettere e le cifre.\n";
	}
	set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	s = 0;
	for( i = 1; i <= 13; i += 2 )
		s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
		s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) ) return false;
    //return "Il codice fiscale non è corretto:\n"+	"il codice di controllo non corrisponde.\n";
	return true;
  //return "";
}






function hasLen(field, minVal, maxVal){
  len=document.forms[0].elements[field].value.toString().length;
  return ((len>=minVal) && (len<=maxVal));
}



function isEuroDate(field) {
  //controlla che sia una data in formato europeo dd/mm/yyyy
  if (isNull(field)) return true;

  object_value=document.forms[0].elements[field].value;
	isplit = object_value.indexOf('/');

	if (isplit == -1 || isplit == object_value.length) return false;
  sDay = object_value.substring(0, isplit);
  
	monthSplit = isplit + 1;
	isplit = object_value.indexOf('/', monthSplit);
	if (isplit == -1 ||  (isplit + 1 )  == object_value.length) return false;
  sMonth = object_value.substring((sDay.length + 1), isplit);

	sYear = object_value.substring(isplit + 1);
  
  //controlla il mese
	if (!checkInteger(sMonth)) return false;
	else  if (!checkRange(sMonth, 1, 12)) return false;
  //controlla l'anno
	else if (!checkInteger(sYear)) return false;
	else if (!checkRange(sYear, 0, null)) return false;
  // controlla il giorno
	else if (!checkInteger(sDay)) return false;
	else if (!checkDay(sYear, sMonth, sDay)) return false;
  // tutto OK
	else return true;
}

//???
function _CF_hasValue(obj, obj_type) {
  if (obj_type == "RADIO" || obj_type == "CHECKBOX")	{
    for (i=0; i < obj.length; i++) {
  		if (obj[i].checked)
			return true;
		}
    return false;	
  }
}

function fileNameTooLong(field, maxLength) {
  str=document.forms[0].elements[field].value;
  for (i=0; i<str.length; i++);
  return (str.length - str.lastIndexOf('\\') - 1)>=maxLength;
}

function setLen (field, textBox) {
  document.forms[0].elements[textBox].value=document.forms[0].elements[field].value.length;
}

function updateTextAreaLen() {
  obj=document.forms[0].elements;
  for (i=0; i<obj.length; i++){
    if (obj[i].type.toString() == 'textarea') {
      if (obj[i].onkeypress != null) {
        obj[i].onkeypress();
      }
    } 
  }
}

/*
funzioni interne
*/

function checkDay(checkYear, checkMonth, checkDay) {
  // controlla se il numero di giorni nella data e' valido
	maxDay = 31;
	if (checkMonth == 4 || checkMonth == 6 || checkMonth == 9 || checkMonth == 11)	maxDay = 30;
	else 
    if (checkMonth == 2) {
		  if (checkYear % 4 > 0)	maxDay =28;
		  else 
        if (checkYear % 100 == 0 && checkYear % 400 > 0) maxDay = 28;
		    else maxDay = 29;
	  }
	return checkRange(checkDay, 1, maxDay); 
}

function checkInteger(object_value) {
  // true se e'un intero
  if (object_value.length == 0) return true;
  //   il numero puo' avere un + o un - iniziali poi solo i caratteri 0-9.
  var decimal_format = ".";
  var check_char;
  //il primo carattere puo' essere + -  blank o una cifra.
  check_char = object_value.indexOf(decimal_format)
  //era un decimale?
  if (check_char < 1) return checkNumber(object_value);
  else return false;
}

function numberRange(object_value, min_value, max_value)  {
  // usata internamente vedi checkRange
  // check minimo
  if (min_value != null){
      if (object_value < min_value)
      return false;
  }

  // check massimo
  if (max_value != null){
    if (object_value > max_value)
    return false;
  }

  //tutto ok
  return true;
}


function checkNumber(object_value) {
  //true se e' un float

  if (object_value.length == 0) return true;

  //Returns true if value is a number defined as
  //   having an optional leading + or -.
  //   having at most 1 decimal point.
  //   otherwise containing only the characters 0-9.
	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

  //The first character can be + - .  blank or a digit.
	check_char = start_format.indexOf(object_value.charAt(0))
  //Was it a decimal?
	if (check_char == 1) decimal = true;
	else if (check_char < 1) return false;
        
	//Remaining characters can be only . or a digit, but only one decimal.
	for (var i = 1; i < object_value.length; i++)	{
		check_char = number_format.indexOf(object_value.charAt(i))
		if (check_char < 0) return false;
		else if (check_char == 1)	{
      // Second decimal.
			if (decimal) return false;
			else decimal = true;
		}
		else if (check_char == 0)	{
			if (decimal || digits)	
				trailing_blank = true;
        // ignore leading blanks
		}
    else if (trailing_blank) return false;
		else digits = true;
	}	
    //tutto OK
    return true
}



function checkRange(object_value, min_value, max_value)  {
  //true se il valore e' nel range indicato
  if (object_value.length == 0) return true;

  if (!checkNumber(object_value))	{ return false; }
  else	{	return (numberRange((eval(object_value)), min_value, max_value));}
  //tutto OK
  return true;
}

