function val_text(obj, label, required, minlength, maxlength)
// valida il contenuto di un campo di testo
{
	var value = obj.value;

	if(required)
	{
		trimmed = trim(value);
		if(trimmed.length==0)
		{
			obj.select(); obj.focus();
			return false;
		}
	}
	if(!(required==false && value.length==0))
	{
		if(minlength!=null && maxlength!=null && minlength==maxlength && value.length!=minlength)
		{
			obj.select(); obj.focus();
			return false;
		}
		if(minlength!=null && value.length<minlength)
		{
			obj.select(); obj.focus();
			return false;
		}
		if(maxlength!=null && value.length>maxlength)
		{
			obj.select(); obj.focus();
			return false;
		}
	}
	
	return true;
}

function val_qtity(obj, label, required, minval, maxval) { return val_menu(obj, label, required, minval, maxval); }
function val_number(obj, label, required, minval, maxval)
// valida il contenuto di un campo numerico integer
{
	var value = obj.value;

	if(required)
	{
		value = trim(value);
		if(value.length==0)
		{
			alert("Il campo \'" + label + "\' è obbligatorio e non può essere lasciato vuoto.");
			obj.select(); obj.focus();
			return false;
		}
	}
	if(!(required==false && value.length==0))
	{
		if(!inValidCharSet(value,"0123456789"))
		{
				alert("Il campo \'" + label + "\' può contenere solo numeri interi.");
				obj.select(); obj.focus();
				return false;
		}
		if(minval!=null || maxval!=null)
			if(parseInt(value)<minval || parseInt(value)>maxval)
			{
					if(minval!=null && maxval!=null)
						alert("Il campo \'" + label + "\' può contenere solo numeri interi compresi tra " + minval + " e " + maxval + ".");
					if(minval!=null && maxval==null)
						alert("Il campo \'" + label + "\' può contenere solo numeri interi maggiori di " + minval + ".");
					if(minval==null && maxval!=null)
						alert("Il campo \'" + label + "\' può contenere solo numeri interi minori di " + maxval + ".");
					obj.select(); obj.focus();
					return false;
			}
	}
	return true;
}

function val_date(obj, label, required, minval, maxval)
// valida il contenuto di un campo date
{
	var value = obj.value;

	if(!required && value=='')
		return true;
	if(required)
	{
		value = trim(value);
		if(value.length==0)
		{
			alert("Il campo \'" + label + "\' è obbligatorio e non può essere lasciato vuoto.");
			obj.select(); obj.focus();
			return false;
		}
	}
	// controllo la validità della data:
	if(!isDate(value))
	{
		alert("Il campo \'" + label + "\' non contiene una data valida.");
		obj.select(); obj.focus();
		return false;
	}
	// controllo che la data specificata sia dentro i limiti:
	if(minval==null)
	{
		if(maxval==null)
		{
			return true;
		}
		else
		{
			maxva = new String(maxval);
			thisdate = new Date(value.substr(6,4), value.substr(3,2), value.substr(0,2)); 
			maxdate = new Date(maxva.substr(6,4), maxva.substr(3,2), maxva.substr(0,2));
			// è impostato solo maxval
			if(thisdate.valueOf()>maxdate.valueOf())
			{
				alert("Il campo \'" + label + "\' non può contenere date successive alla data "+maxval+".");
				obj.select(); obj.focus();
				return false;
			}
		}
	}
	else
	{
		if(maxval==null)
		{
			// è impostato solo minval
			minva = new String(minval);
			thisdate = new Date(value.substr(6,4), value.substr(3,2), value.substr(0,2)); 
			mindate = new Date(minva.substr(6,4), minva.substr(3,2), minva.substr(0,2));
			if(thisdate.valueOf()<mindate.valueOf())
			{
				alert("Il campo \'" + label + "\' non può contenere date antecedenti alla data "+minval+".");
				obj.select(); obj.focus();
				return false;
			}
		}
		else
		{
			// sono impostati sia minval che maxval
			minva = new String(minval);
			maxva = new String(maxval);
			thisdate = new Date(value.substr(6,4), value.substr(3,2), value.substr(0,2)); 
			mindate = new Date(minva.substr(6,4), minva.substr(3,2), minva.substr(0,2));
			maxdate = new Date(maxva.substr(6,4), maxva.substr(3,2), maxva.substr(0,2));
			if(thisdate.valueOf()<mindate.valueOf() || thisdate.valueOf()>maxdate.valueOf())
			{
				alert("Il campo \'" + label + "\' può contenere solamente date comprese tra la data "+minval+" e la data "+maxval+".");
				obj.select(); obj.focus();
				return false;
			}
		}
	}

	return true;
}

function val_time(obj, value, label, required)
// la procedura è particolare perché sono usati due select. come obj passare solo uno dei due <select>;
// come valore passare l'orario nel formato hh:mm. il resto dei parametri è normale.
{
	if(!inValidCharSet(value,'0123456789:') && value!='__null:__null')
	{
		alert("Il campo \'" + label + "\' deve contenere un orario valido.");
		obj.select(); obj.focus();
		return false;
	}
	return true;
}

function val_list(label, value, required) { return val_menu(label, value, required); }
function val_menu(label, value, required)
// valida un menu a tendina
{
		if(required==true)
		{
				if(value=="__null")
				{
						return false;
				}
		}
		return true;
}

function ltrim(str)
{
	 var whitespace = new String(" \t\n\r");

	 var s = new String(str);

	 if (whitespace.indexOf(s.charAt(0)) != -1) {
			// We have a string with leading blank(s)...

			var j=0, i = s.length;

			// Iterate from the far left of string until we
			// don't have any more whitespace...
			while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
				 j++;

			// Get the substring from the first non-whitespace
			// character to the end of the string...
			s = s.substring(j, i);
	 }
	 return s;
}

function rtrim(str)
{
	 // We don't want to trip JUST spaces, but also tabs,
	 // line feeds, etc.  Add anything else you want to
	 // "trim" here in Whitespace
	 var whitespace = new String(" \t\n\r");

	 var s = new String(str);

	 if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
			// We have a string with trailing blank(s)...

			var i = s.length - 1;       // Get length of string

			// Iterate from the far right of string until we
			// don't have any more whitespace...
			while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
				 i--;


			// Get the substring from the front of the string to
			// where the last non-whitespace character is...
			s = s.substring(0, i+1);
	 }

	 return s;
}

function trim(str)
{
	 return rtrim(ltrim(str));
}

function inValidCharSet(str,charset)
{
	var result = true;

	// Note: doesn't use regular expressions to avoid early Mac browser bugs	
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}
	
	return result;
}

// VALIDAZIONE DELLE DATE /////////////////////////////////////////////////////////////////////////////////////////
var dtCh= "-";
var minYear=1970;
var maxYear=2029;

function isInteger(s)
{
	var i;
	for (i = 0; i < s.length; i++)
	{   
		var c = s.charAt(i);
		if(((c<"0") || (c>"9")))
			return false;
	}
	return true;
}

function stripCharsInBag(s, bag)
{
	var i;
  var returnString = "";
  // Search through string's characters one by one.
  // If character is not in bag, append to returnString.
  for (i = 0; i < s.length; i++)
	{   
		var c = s.charAt(i);
    if (bag.indexOf(c) == -1) returnString += c;
	}
  return returnString;
}

function daysInFebruary(year)
{
	// February has 29 days in any year evenly divisible by four,
  // EXCEPT for centurial years which are not also divisible by 400.
  return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n)
{
	for(var i=1; i<=n; i++)
	{
		this[i] = 31;
		if(i==4 || i==6 || i==9 || i==11)
			this[i] = 30;
		if(i==2)
			this[i] = 29;
  } 
	return this;
}

function isDate(dtStr)
{
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strDay=dtStr.substring(0,pos1);
	var strMonth=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	strYr=strYear;
	if(strDay.charAt(0)=="0" && strDay.length>1)
		strDay=strDay.substring(1);
	if(strMonth.charAt(0)=="0" && strMonth.length>1)
		strMonth=strMonth.substring(1);
	for(var i = 1; i <= 3; i++)
	{
		if(strYr.charAt(0)=="0" && strYr.length>1)
			strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if(pos1==-1 || pos2==-1)
	{
		return false; // la data non è nel formato gg/mm/aaaa
	}
	if(strMonth.length<1 || month<1 || month>12){
		return false; // il mese non è valido
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		return false; // il giorno non è valido
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		return false; // l'anno non è valido o non è compreso tra minYear e maxYear
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		return false; // la data non è valida
	}
	return true;
}