/*

Date functions

*/

function date_valid_db8(val)
{
	var datepieces = null;

	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}
	
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	var daysinmonth = date_daysinmonth(month, year);
	
	return day >= 1 && day <= daysinmonth && month >= 1 && month <= 12 && year >= 1900 && year <= 2100;
}

function date_valid_human8(val)
{
	var datepieces = null;

	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}
	
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	var daysinmonth = date_daysinmonth(month, year);
	
	return day >= 1 && day <= daysinmonth && month >= 1 && month <= 12 && year >= 1900 && year <= 2100;
}

function date_now_db8()
{
	var date1 = new Date();
	
	var day = date1.getDate();
	var month = date1.getMonth() + 1;
	var year = date1.getFullYear();
	
	if (day < 10)
	{
		day = "0" + day;
	}
	
	if (month < 10)
	{
		month = "0" + month;
	}
	
	return year + "-" + month + "-" + day;
}

function date_now_human8()
{
	var date1 = new Date();
	
	var day = date1.getDate();
	var month = date1.getMonth() + 1;
	var year = date1.getFullYear();
	
	if (day < 10)
	{
		day = "0" + day;
	}
	
	if (month < 10)
	{
		month = "0" + month;
	}
	
	return day + "-" + month + "-" + year;
}

function date_now_unix()
{
	var date1 = new Date();
	
	return parseInt(date1.getTime() / 1000);
}

function date_db8_human8(val)
{
	var datepieces = null;

	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_db8(val))
	{
		return false;
	}
	
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	return day + "-" + month + "-" + year;
}

function date_db8_unix(val)
{
	var datepieces = null;
	
	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}
	
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	var date1 = new Date();
	
	date1.setDate(day);
	date1.setMonth(month - 1);
	date1.setFullYear(year);
	date1.setHours(0);
	date1.setMinutes(0);
	date1.setSeconds(0);
	
	return parseInt(date1.getTime() / 1000);
}

function date_human8_db8(val)
{
	var datepieces = null;

	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_human8(val))
	{
		return false;
	}
	
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	return year + "-" + month + "-" + day;
}

function date_human8_unix(val)
{
	var datepieces = null;
	
	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}
	
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	var date1 = new Date();

	date1.setDate(day);
	date1.setMonth(month - 1);
	date1.setFullYear(year);
	date1.setHours(0);
	date1.setMinutes(0);
	date1.setSeconds(0);

	return parseInt(date1.getTime() / 1000);
}

function date_db8_day(val)
{
	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_db8(val))
	{
		return false;
	}
	
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	return day;
}

function date_db8_month(val)
{
	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_db8(val))
	{
		return false;
	}
	
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	return month;
}

function date_db8_year(val)
{
	if (datepieces = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(val))
	{} else {
		return false;
	}

	if (!date_valid_db8(val))
	{
		return false;
	}
	var day = datepieces[3];
	var month = datepieces[2];
	var year = datepieces[1];
	
	return year;
}

function date_human8_day(val)
{
	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_human8(val))
	{
		return false;
	}
	
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	return day;
}

function date_human8_month(val)
{
	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}
	
	if (!date_valid_human8(val))
	{
		return false;
	}
	
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	return month;
}

function date_human8_year(val)
{
	if (datepieces = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec(val))
	{} else {
		return false;
	}

	if (!date_valid_human8(val))
	{
		return false;
	}
	var day = datepieces[1];
	var month = datepieces[2];
	var year = datepieces[3];
	
	return year;
}

function date_modify_db8(val, daysoffset)
{
	var day = parseInt(date_db8_day(val), 10);
	var month = parseInt(date_db8_month(val), 10);
	var year = parseInt(date_db8_year(val), 10);
	
	day += daysoffset;
	
	var date = date_recalculate(day, month, year);
	
	return date[2] + "-" + date[1] + "-" + date[0];
}

function date_modify_month_db8(val, monthsoffset)
{
	var day = parseInt(date_db8_day(val), 10);
	var month = parseInt(date_db8_month(val), 10);
	var year = parseInt(date_db8_year(val), 10);
	
	month += monthsoffset;
	
	var date = date_recalculate(day, month, year);
	
	return date[2] + "-" + date[1] + "-" + date[0];
}

function date_modify_human8(val, daysoffset)
{
	var day = parseInt(date_human8_day(val), 10);
	var month = parseInt(date_human8_month(val), 10);
	var year = parseInt(date_human8_year(val), 10);
	
	day += daysoffset;
	
	var date = date_recalculate(day, month, year);
	
	return date[0] + "-" + date[1] + "-" + date[2];
}

function date_recalculate(day, month, year)
{
	while (month > 12)
	{
		month -= 12;
		year += 1;
	}
	
	while (month < 1)
	{
		month += 12;
		year -= 1;
	}
	
	while (day > date_daysinmonth(month, year))
	{
		day -= date_daysinmonth(month, year);
		month += 1;
		
		// this could be a rollover
		if (month > 12)
		{
			month -= 12;
			year += 1;
		}		
	}

	while (day < 1)
	{
		month -= 1;
		
		// this could be a rollover
		if (month < 1)
		{
			month += 12;
			year -= 1;
		}
		
		day += date_daysinmonth(month, year);
	}
	
	day = day.toString();
	month = month.toString();
	year = year.toString();
	
	if (day.length < 2)
	{
		day = "0" + day;
	}
	if (month.length < 2)
	{
		month = "0" + month;
	}
	
	var date = new Array(day, month, year);
	
	return date;
}

function date_daysinmonth(month, year)
{
	if (month < 1 || month > 12)
	{
		return false;
	}
	
	daysinmonth = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	
	if (month != 2)
	{
		return daysinmonth[month - 1];
	}
	
	// february is a special case
	if (year % 4 == 0)
	{
		if (year % 400 == 0)
		{
			return 28
		} else
		{
			return 29;
		}
	} else
	{
		return 28;
	}
}

function date_human8_firstmonthdate(date)
{
	var month = date_human8_month(date);
	var year = date_human8_year(date);
	
	var startdate = "01-" + month + "-" + year;
	
	return startdate;
}

function date_human8_lastmonthdate(date)
{
	var month = date_human8_month(date);
	var year = date_human8_year(date);
	var daysinmonth = date_daysinmonth(month, year);
	
	var enddate = daysinmonth + "-" + month + "-" + year;
	
	return enddate;
}
