
// 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;
				}
				// Check if a leap year
				return (date[2]==29 && date[1]==2 && (date[0] % 4 == 0));
			}
		}
	}
	return false;
}

// Convert day/month/year to ISO date
function cvtDateToISO(day, month, year) {
  	return (year + "-" + month + "-" + day);
}

// Convert ISO to a date object
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);
	return fmtDateISO(aDate);
}

function fmtISODate(aDate) {
	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);
	}
}

// Return the abs difference in months between 2 ISO dates
function monthDiff(isoDate1,isoDate2) {
	var mth1=Number(isoDate1.substr(0,4)) * 12 + Number(isoDate1.substr(5,2)); 
	var mth2=Number(isoDate2.substr(0,4)) * 12 + Number(isoDate2.substr(5,2)); 
	return Math.abs(mth1-mth2);
}

// Set display date to specified ISO date
function setDspDate(isoDate,dayObj,monthObj,yearObj) {
	if (isValidDate(isoDate)) {
        var date = isoDate.split("-");
        setSelectionValue(dayObj,date[2]);
        setSelectionValue(monthObj,date[1]);
        setSelectionValue(yearObj,date[0]);
	} else {
		dayObj.selectedIndex= -1;
		monthObj.selectedIndex= -1;
		yearObj.selectedIndex= -1;		
	}
}

function buildDateSelection(dayField,mthField,yearField,monthNames,startYear,yearCount,asString) {
	var dayList  = dayField + buildDayList(true);
	var mthList  = mthField + buildMonthList(monthNames,true);
	var yearList = yearField + buildYearList(startYear,yearCount,true);
	var s = dayList + mthList + yearList;
	if (asString)
		return s;
	document.writeln(s);
}

function buildDayList(asString) {
	var opts=" ";
	var vals=" ";
	for (var i=1; i<=31; i++) {
		opts+="|"+i;
		vals+="|"+(i<10?'0':'')+String(i);
	}
	return buildSelection(opts,vals,0,asString);
}

function buildMonthList(monthNames, asString) {
	var opts = " ";
	var vals = " ";
	var mth = monthNames.split("|");
	for (var i=1; i<=12; i++) {
		opts+="|"+mth[i];
		vals+="|"+(i<10?'0':'')+String(i);
	}
	return buildSelection(opts,vals,0,asString);
}

function buildYearList(startYear, yearCount, asString) {
	var opts=" ";
	var vals=" ";
	var year = startYear;
	for (var i=yearCount; i>0; i--) {
		opts+="|"+year;
		vals+="|"+year;
		year--;
	}
	return buildSelection(opts,vals,0,asString);
}

