// Validate a date
function isValidDate(isoDate) {
	if (isoDate==null) {return false;}
	var maxDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var date = isoDate.split("-");
	if (date[0] >= 1900 && date[0] < 2100) {
		if (date[1] > 0 && date[1] <= 12) {
			if (date[2] > 0) {
				if (date[2] <= maxDays[date[1]-1]) {
					return true;
				}
				return (date[2]==29 && date[1]==2 && (date[0] % 4 == 0));
			}
		}
	}
	return false;
}
// Convert day/monthYear to ISO date
function cvtDateToISO(day, monthYear) {
  	return (monthYear + "-" + day);
}

function fmtISODate(isoDate) {
	return addDays(isoDate,0);
}

function cvtISOToDate(isoDate) {
	var atomDate= isoDate.split('-');
	var aDate=new Date(parseInt(atomDate[0],10),parseInt(atomDate[1],10)-1,parseInt(atomDate[2],10),6,0,0);
	return aDate;
}

// Add a number of days to an ISO date
function addDays(isoDate, noOfDays) {
	var aDate=cvtISOToDate(isoDate);
	if (!aDate) return "";
	var millis=86400000 * noOfDays;
	aDate=new Date(aDate.getTime()+millis);
	with (aDate) {
		var mm=getMonth()+1;
		if (mm<10) {mm='0'+mm;}
		var dd=getDate();
		if (dd<10) {dd='0'+dd;}
		return (getFullYear() + '-' + mm + '-' + dd);
	}
}
// Check for a valid display date
function isValidDspDate(isoDate, earliestDate, latestDate) {
	return (isValidDate(isoDate) && isoDate>= earliestDate && isoDate<=latestDate);
}
// Get display date as ISO date
function getDspDate(dayObj,monthYearObj) {
	var day=getSelectionValue(dayObj);
	var monthYear=getSelectionValue(monthYearObj);
	if (Number(day)<1 || monthYear=='') {
		return null;
	}
	return cvtDateToISO(day,monthYear);
}

// Return the abs difference in months between 2 ISO dates
function monthDiff(date1,date2) {
	var mth1=Number(date1.substr(0,4)) * 12 + Number(date1.substr(5,2));
	var mth2=Number(date2.substr(0,4)) * 12 + Number(date2.substr(5,2));
	return Math.abs(mth1-mth2);
}

// Return a month name from a localized string
function getMonthName(month,monthNames) {
	var names=monthNames.split('|');
	return names[month-1];
}
// Set display date to specified ISO date
function setDspDate(isoDate,dayObj,monthYearObj) {
	if (isValidDate(isoDate)) {
        	var date= isoDate.split("-");
        	var monthYear= date[0] +'-' + date[1];
        	var count=monthYearObj.length;
        	for (var idx= 0; idx< count; idx++) {
        		if (monthYearObj.options[idx].value== monthYear) {
        			monthYearObj.options[idx].selected= true;
				setSelectionValue(dayObj,date[2]);
        			return;
        		}
        	}
	}
	dayObj.selectedIndex= -1;
	monthYearObj.selectedIndex= -1;
}
// Get display time
function getDspTime(hrsObj,minsObj) {
	var hh=getSelectionValue(hrsObj);
	if (Number(hh)==0)
		return null;
	var mm=getSelectionValue(minsObj);
	if (Number(mm)==0)
		return null;
	return hh+mm;
}
// Set display time
function setDspTime(dspTime,hrsObj,minsObj) {
	if (dspTime.length!=4)
		dspTime=pad(dspTime,'0',4);
	setSelectionValue(hrsObj,dspTime.substr(0,2));
	setSelectionValue(minsObj,dspTime.substr(2,2));
}