// JavaScript 1.2 Document
/*
	Libreria funzioni che operano su valori data:
		Versione 1.1
		Ultima modifica/revisione: 20/02/2004.
		Autore: Baket
	Vedi fnc_date_inc.doc per una descrizione delle funzioni esportate.
*/


// Modificare il valore del seguente intero per stabilire il formato della data.
// Come separatore tra i numero possono essere usati i caratteri '-', '/' o '.'.
var dateSimpleFormat = 0;

// Restituisce un array con giorno,mese,anno (nell'ordine) in formato numerico.
function matchDateStr(dateStr) { 
	var datePat, dp, mp, yp;
	switch (dateSimpleFormat) {
		case 0: // Formato europeo: d-m-Y;
			datePat = /^(\d{1,2})(\/|-|\.)(\d{1,2})(\/|-|\.)(\d{4})$/; 
			dp=1; mp=3; yp=5;
			break;
		case 1: // Formato anglosassone: m-d-Y;
			datePat = /^(\d{1,2})(\/|-|\.)(\d{1,2})(\/|-|\.)(\d{4})$/;
			dp=3; mp=1; yp=5;
			break;
		case 2: // Formato internazionale (ISO 8601): Y-m-d;
			datePat = /^(\d{4})(\/|-|\.)(\d{1,2})(\/|-|\.)(\d{1,2})$/;
			dp=5; mp=3; yp=1;
			break;
	}
	var matchArray = dateStr.match(datePat); 
	if (matchArray==null) return null;
	if (matchArray[2]!=matchArray[4]) return null;
	var retArray = new Array(3);
	retArray[0] = parseInt(matchArray[dp], 10); 
	retArray[1] = parseInt(matchArray[mp], 10);
	retArray[2] = parseInt(matchArray[yp], 10);
	return retArray;
}

function isDate(dateStr) {
	if (dateStr.length == 0) return true; // Stringa nulla.
	
	var matchArray = matchDateStr(dateStr); // is the format ok?
	if (matchArray == null) return false;
	day = matchArray[0];
	month = matchArray[1]; 
	year = matchArray[2];

	if (month < 1 || month > 12) return false;
	if (day < 1 || day > 31) return false;
	if ((month==4 || month==6 || month==9 || month==11) && day==31) return false;
	
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) 
			return false;
	}
	return true; // date is valid
}

var msgIsDate = 'Valore data indicato in modo errato';

function fldIsDate(fld, fldName) {
	if (!isDate(fld.value)) {
		alert(fldName + ': ' + msgIsDate );
		fld.focus();
		return false;	
	}
	return true;
}

function compareDates(dt1, dt2) {   // -1 se d1 < d2, 0 se d1 = d2, +1 se d1 > d2. null se date non valide.
	var aD1 = matchDateStr(dt1); 
	var aD2 = matchDateStr(dt2);
	if ((aD1==null)||(aD2==null)) return;
	for(var i=2; i>=0; i--) {
		if (aD1[i] < aD2[i]) return -1;
		else if(aD1[i] > aD2[i]) return 1;
	}	
	return 0;
}

function subDates(dt1,dt2) {
	var aD1 = matchDateStr(dt1); 
	var aD2 = matchDateStr(dt2);
	var isleap;
	var leapCount = 0;
	var yearCount = 0;
	var days = 0;
	
	for(var year=aD1[2]; year<=aD2[2]; year++) 
	{
		isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if(isleap)
			leapCount++;
		yearCount++;
	}
	
	days = yearCount * 365;
	
	for(var month=1; month<13; month++)
	{
		if(month<aD2[1] || month>=aD1[1]) 
		{
			if(month==2) 
				days = days - 28;
			if (month==4 || month==6 || month==9 || month==11) 
				days = days - 30;	
			if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) 
				days = days - 31;
		}
	}
	
	for(var month=aD1[1]; month<aD2[1]; month++)
	{
		if(month==2)
			days = 28;
		if (month==4 || month==6 || month==9 || month==11) 
			days = days + 30;
		if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) 
			days = days + 31;
	}
	
	days = days - aD1[0] + aD2[0];
	
	if(aD1[1]<=2 && aD2[1]>2 && leapCount==1) {
		days++;
		if(yearCount>1)
			for(var i=2; i<leapCount; i++)
				days++;
	}
		
	return days;
	
}
