var mdate =
{
	'monthLength': [ 31,28,31,30,31,30,31,31,30,31,30,31 ],
	'monthsShort': [ 'jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec' ],
	'monthsLong': [ 'januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december' ],

	'DIFF_DATE_BORDER': 1,
	'DIFF_PERIODS': 2,
	'DIFF_PERIODS_FRAC': 4
};

(function()
{
	mdate.parseDate = function date_parseDate(str)
	{
		var type = typeof str;
		if (type != 'string' && type != 'number')
			return false;

		str = str+''; // als het een nummer is, converteert-ie nu naar string

		if (str.match(/^[0-9]{13}$/))
			return new Date(parseInt(str, 10));

		if (str.match(/^(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-(((19|20)?[0-9])?[0-9])$/))
		{
			// format = (d)d-(m)m-((yy)y)y
			var dateparts = str.split('-');

			var century = dateparts[2].length <= 2 ? (parseInt(dateparts[2], 10) >= 70 ? 1900 : 2000) : 0;
			var year  = century + parseInt(dateparts[2], 10);
			var month = parseInt(dateparts[1], 10) - 1; // Javascript months go from 0 to 11
			var day   = parseInt(dateparts[0], 10);
		}

		else if (str.match(/^(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])([0-9]{2})$/))
		{
			// format = ddmmyy
			var century = parseInt(str.substr(4, 2), 10) >= 70 ? 1900 : 2000;
			var year  = century + parseInt(str.substr(4, 2), 10);
			var month = parseInt(str.substr(2, 2), 10) - 1; // Javascript months go from 0 to 11
			var day   = parseInt(str.substr(0, 2), 10);
		}

		else if (str.match(/^((19|20)[0-9]{2})-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/))
		{
			// format = yyyy-(m)m-(d)d
			var dateparts = str.split('-');
			var year  = parseInt(((dateparts[0].length == 2) ? '20' : '') + dateparts[0], 10);
			var month = parseInt(dateparts[1], 10) - 1; // Javascript months go from 0 to 11
			var day   = parseInt(dateparts[2], 10);
		}

		else if (str.match(/^((19|20)[0-9]{2})(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/))
		{
			// format = yyyymmdd
			var year  = parseInt(str.substr(0, 4), 10);
			var month = parseInt(str.substr(4, 2), 10) - 1; // Javascript months go from 0 to 11
			var day   = parseInt(str.substr(6, 2), 10);
		}

		else if (str.match(/^(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])((19|20)[0-9]{2})$/))
		{
			// format = ddmmyyyy
			var year  = parseInt(str.substr(4, 4), 10);
			var month = parseInt(str.substr(2, 2), 10) - 1; // Javascript months go from 0 to 11
			var day   = parseInt(str.substr(0, 2), 10);
		}

		else
			return false;

		var monthLength = this.monthLength[month];
		if (month == 1 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
			monthLength = 29;
		if (day > monthLength)
			return false;

		var d = new Date(0);
		d.setFullYear(year);
		d.setMonth(month);
		d.setDate(day);

		return d;
	};

	mdate.check = function date_check(str)
	{
		return this.parseDate(str) ? true : false;
	};

	mdate.format = function date_format(d, format)
	{
		if (!(d instanceof Date))
		{
			d = this.parseDate(d);
			if (!d)
				return false;
		}

		if (typeof format != 'string')
			format = 'yyyymmdd';

		var month = d.getMonth()+1;
		var day = d.getDate();
		var hours = d.getHours();
		var minutes = d.getMinutes();
		var seconds = d.getSeconds();

		switch (format)
		{
			case 'd mmm': return day+' '+this.monthsShort[month-1];
			case 'd mmmm': return day+' '+this.monthsLong[month-1];
			case 'd mmm yyyy': return day+' '+this.monthsShort[month-1]+' '+d.getFullYear();
			case 'd mmmm yyyy': return day+' '+this.monthsLong[month-1]+' '+d.getFullYear();
			case 'd mmm. yyyy': return day+' '+this.monthsShort[month-1]+'. '+d.getFullYear();
			case 'dd-mm-yyyy': return (day < 10 ? '0' : '')+day+'-'+(month < 10 ? '0' : '')+month+'-'+d.getFullYear();
			case 'ddmmyy':     return (day < 10 ? '0' : '')+day+(month < 10 ? '0' : '')+month+(d.getYear() % 100);
			case 'yyyy-mm-dd': return d.getFullYear()+'-'+(month < 10 ? '0' : '')+month+'-'+(day < 10 ? '0' : '')+day;
			case 'hhmm': return (hours < 10 ? '0' : '')+hours+(minutes < 10 ? '0' : '')+minutes;
			case 'hh:mm': return (hours < 10 ? '0' : '')+hours+':'+(minutes < 10 ? '0' : '')+minutes;
			case 'hhmmss': return (hours < 10 ? '0' : '')+hours+(minutes < 10 ? '0' : '')+minutes+(seconds < 10 ? '0' : '')+seconds;
			case 'hh:mm:ss': return (hours < 10 ? '0' : '')+hours+':'+(minutes < 10 ? '0' : '')+minutes+':'+(seconds < 10 ? '0' : '')+seconds;
			case 'yyyymmdd': return d.getFullYear()+(month < 10 ? '0' : '')+month+(day < 10 ? '0' : '')+day;
		}

		return false;
	};

	mdate.dateDiff = function date_dateDiff(date1, date2, flags)
	{
		var d1 = (date1 instanceof Date) ? new Date(date1.valueOf()) : this.parseDate(date1);
		var d2 = (date2 instanceof Date) ? new Date(date2.valueOf()) : this.parseDate(date2);
		if (!d1 || !d2)
			return false;

		var DIFF_DATE_BORDER = true;
		var DIFF_PERIODS = true;
		var DIFF_PERIODS_FRAC = false;
		if (typeof flags !== 'undefined')
		{
			DIFF_DATE_BORDER = flags & this.DIFF_DATE_BORDER;
			DIFF_PERIODS = DIFF_DATE_BORDER || (flags & this.DIFF_PERIODS);
			DIFF_PERIODS_FRAC = !DIFF_DATE_BORDER && (flags & this.DIFF_PERIODS_FRAC);
		}

		if (DIFF_DATE_BORDER)
		{
			d1.setHours(12);
			d2.setHours(12);
		}

		var diff = (d2.valueOf() - d1.valueOf()) / 86400000;  // 86400000 = 1000ms * 60s * 60m * 24h
		if (DIFF_PERIODS_FRAC)
			return diff;

		return Math.round(diff);
	};

})();

var date = mdate; // backwards compatibility, als browsers nog oude code in de cache hebben

