function isDate(year,month,day){ // month = 1-12
	with (new Date(year, month-1, day)){
    	return ((getFullYear()==year) && (getMonth()==(month-1))) 
	}
}

function dateTimeDiff(date1,  date2){ //date2 - date1
	var date2obj = readISODateTime(date2)
	var date1obj = readISODateTime(date1)
	return (date2obj.getTime()-date1obj.getTime());
}

function dateDiff(date1,  date2){ //date2 - date1
	var date2obj = readISODate(date2)
	var date1obj = readISODate(date1)
	return (date2obj.getTime()-date1obj.getTime());
}

function readISODate(Q) { // Q= ISO date: 1990-02-28
	if (Q.search(/^\d+\-\d\d\-\d\d$/)!=0) { return -2 } // bad format
	var T = Q.split('-')
	if (!isDate(T[0], T[1], T[2])) { return -1 } // bad value
	var dateObj = new Date (T[0], T[1]-1, T[2])
	return dateObj 
 }
 
function readISODateTime(Q) { // Q= ISO datetime: 1990-02-28 12:00:00
	if (Q.search(/^\d+\-\d\d\-\d\d\s\d\d\:\d\d\:\d\d$/)!=0) { return -2 } // bad format
	var S = Q.split(' ')
	var D = S[0].split('-')
	var T = S[1].split(':')
	
	if (!isDate(D[0], D[1], D[2])) { return -1 } // bad value
	if (!isTime(T[0], T[1], T[2])) { return -1 } // bad value
	var dateObj = new Date (D[0], D[1]-1, D[2],T[0], T[1], T[2])
	return dateObj 
	
 }
 
function isTime(h, m, s){
	with (new Date(0,0,0,h,m,s)){
		return ((getHours()==h) && (getMinutes()==m)) 
	}
}

/*
function readISOTime(Q) { var T // adaptable to other layouts
	if ((T = /^(\d\d):(\d\d):(\d\d)$/.exec(Q)) == null) { return -2 } // bad format
	if (!ValidTime(T[1], T[2], T[3])) { return -1 } // bad value
	return [ T[1], T[2], T[3] ] 
}
*/