/* $Id: DateParser.js 131687 2011-06-20 09:03:24Z rj $ */

var DATE_REGEX = 		
		"([0-9]{1,2})" + "(?:-|\/|\ ||\.|:)" + 	// day
		"([0-9]{1,2})" + "(?:-|\/|\ ||\.|:)" + 	// month
		"([0-9]{4}|[0-9]{2}|)" + 				// year
		"(?: +|)" + 							// space
		"([0-9]{1,2}|)" + "(?:[\ :]|)" +		// hour
		"([0-9]{1,2}|)" + 						// minute
		"(?:\:[0-9]{1,2}|)"; 					// sec

var DATE_REGEX_STRICT = 
		"^\s*"+ DATE_REGEX;
		
var DateParser = {

	"DATE_PARSE_REGEX" : new RegExp(DATE_REGEX_STRICT),
	
	"DATE_DMYHMS_PARSE_REGEX" : new RegExp(DATE_REGEX),
		
	"NUMBER_DATE_REGEX" : new RegExp("^([+-]?[1-9][0-9]*|0{1})(d|w|m|j|u|)$"),

	"_specialDate" : function(sDate) {
		if (sDate.match(DateParser.NUMBER_DATE_REGEX)) {
			var iOffset = parseInt(RegExp.$1, 10);
			if (Math.abs(iOffset) > 365) {
				// dit is om te zorgen dat 01012005 ook als geldige invoer
				// wordt gezien.
				return null;
			}
			var oDate = new Date();
			switch (RegExp.$2) {
				case "":
				case "d":
					oDate.setDate(oDate.getDate() + iOffset);
					break;
				case "u":
					oDate.setHours(oDate.getHours() + iOffset);
					break;
				case "w":
					oDate.setDate(oDate.getDate() + iOffset * 7);
					break;
				case "m":
					oDate.setMonth(oDate.getMonth() + iOffset);
					break;
				case "j":
					oDate.setFullYear( oDate.getFullYear() + iOffset);
					break;
				default:
					return error("DateParser.js", "Invalid regexp match!");
			}
			return oDate;
		}
		var aSpecial = [];
		aSpecial["vandaag"] = 0;
		aSpecial["nu"] = 0;
		aSpecial["gisteren"] = -1;
		aSpecial["eergisteren"] = -2;
		aSpecial["morgen"] = 1;
		aSpecial["overmorgen"] = 2;
		for (var sKey in aSpecial) {
			if (sKey == sDate) {
				var oDate = new Date();
				oDate.setDate(oDate.getDate() + aSpecial[sKey]);
				return oDate;
			}
		}
		if (typeof(__birdthdays) != "undefined") {
			if (typeof(__birdthdays[sDate]) != "undefined") {
				return DateParser._doeVerjaardag(__birdthdays[sDate]);
			}
		}
		return null;
	},

	"_doeVerjaardag" : function(sStr) {
		var oDate = DateParser.parseDate(sStr);
		if (oDate == null) {
			return null;
		}
		if (oDate < new Date()) {
			oDate.setFullYear(new Date().getFullYear());
			if (oDate < new Date()) {
				oDate.setFullYear(new Date().getFullYear() + 1);
			}
		}
		return oDate;
	},

	"parseDate" : function(sDate) {
		
		if (sDate == null || sDate == '') {
			return null;
		}

		var oDate = DateParser._specialDate(sDate);
		if (oDate != null) {
			return oDate;
		}

		if (!sDate.match(DateParser.DATE_PARSE_REGEX)) {
			return null;
		}

		var oDate = new Date(0);

		var sDay = RegExp.$1;
		var sMonth = RegExp.$2;
		var sYear = RegExp.$3 || "" + new Date().getFullYear();
		var sHour = RegExp.$4;
		var sMinute = RegExp.$5;

		var sDebug = '';
		if (parseInt(sDay, 10) > 31) {
			sMonth = sDay.substring(1) + sMonth;
			sDay   = sDay.substring(0,1);
		}
		if (parseInt(sMonth, 10) > 12) {
			sYear  = sMonth.substring(1) + sYear;
			sMonth = sMonth.substring(0,1);
		}

		if (sYear.length == 4) {
			sDebug += sYear + ' ';
			oDate.setFullYear(sYear);
		} else {
			var iYear = parseInt(sYear, 10);
			if (iYear < 70) {
				iYear += 2000;
			} else if (iYear < 100) {
				iYear += 1900;
			}
			sDebug += iYear + ' ';
			oDate.setFullYear(iYear);
		}

		if (isNaN(oDate)) { // Jaar is groter dan 275760.
			return null;
		}

		var iMonth = parseInt(sMonth, 10);
		sDebug += iMonth + '-';
		oDate.setMonth(iMonth - 1);

		sDebug += sDay + '-';
		oDate.setDate(sDay);

		if (sHour) {
			var iHour = parseInt(sHour, 10);
			if (iHour >= 0 && iHour <= 24) {
				oDate.setHours(iHour);
			}
			sDebug += sHour + ':';
		} else { // default 9:00 uur asl er geen tijd op gegeen is.
			oDate.setHours(9);
		}

		if (sMinute) {
			var iMinute = parseInt(sMinute, 10);
			if (iMinute >= 0 && iMinute <= 59) {
				oDate.setMinutes(iMinute);
			}
			sDebug += sMinute ;
		}
		return oDate;
	},

	"formatDate" : function(oDate, sFormat) {
		if (!oDate || !oDate.print) {
			return '';
		}
		if (sFormat == 'date') {
			return oDate.print("%d-%m-%Y");
		} else if (sFormat == 'datetime') {
			return oDate.print("%d-%m-%Y %H:%M");
		} else if (sFormat == 'datetimefull') {
			return oDate.print("%d-%m-%Y %H:%M:%S");
		} else if (sFormat == 'time') {
			return oDate.print("%H:%M");
		} else if (sFormat == 'timefull') {
			return oDate.print("%H:%M:%S");
		}
		return error("formatDate", "Unknown date format '" + sFormat + "'");
	},

	"rewriteBirthDay" : function(oInput) {
		var oDate = parseDate(oInput.value);
		if (oDate) {
			if (oDate.valueOf() > new Date().valueOf()) {
				oDate.setYear(oDate.getYear() - 100);
			}
			oInput.value = formatDate(oDate, 'date');
		}
	},
	
	"parseFirstDate" : function(s) {
		if (s == null || s == '') {
			return null;
		}
		var result = s.match(DateParser.DATE_DMYHMS_PARSE_REGEX);
		if (result && result.length > 0) {
			return parseDate(result[0]);
		}
		return null;
	}
};

function rewriteBirthDay(oInput) {
	return DateParser.rewriteBirthDay(oInput);
}

function parseDate(sDate) {
	return DateParser.parseDate(sDate);
}

function formatDate(oDate, sFormat) {
	return DateParser.formatDate(oDate, sFormat);
}

function parseFirstDate(s) {
	return DateParser.parseFirstDate(s);
}

