function ValidDate(y, m, d) 
{ // m = 0..11 ; y m d integers, y!=0
	with (new Date(y, m, d))
	return (getMonth()==m && getDate()==d) /* was y, m */ 
}

function ReadISO8601date(Q) 
{ 
	var T;
	if ((T = /^(\d+)([-\/])(\d\d)(\2)(\d\d)$/.exec(Q)) == null)
    { 
		return -2 ;
	} // bad format
	for (var j=1; j<=5; j+=2)
	{
		T[j] = +T[j];
	}
	if (!ValidDate(T[1], T[3]-1, T[5])) 
	{ 
		return -1 ;
	} // bad value
	return [ T[1], T[3], T[5] ];
}

function differenza_giorni(S1, S2) 
{
	var X = ReadISO8601date(S1); 
	if (X<0) 
	{ 
		alert('La data di inizio e\' errata!'); 
	}
	var Y = ReadISO8601date(S2); 
	if (Y<0) 
	{ 
		alert('La data di fine e\' errata!'); 
	}
	var Dx = Date.UTC(X[0], X[1]-1, X[2]);
	var Dy = Date.UTC(Y[0], Y[1]-1, Y[2]);
	
	return (Dx-Dy)/864e5;
}
