var NUM_CENTYEAR = 30;
var cal_error_str = "";
var RE_NUM = /^\.?\d+$/;

function cal_prs_date1 (str_date) {
	str_date = str_date.replace(/[\,\+\-\/]/gi, ".");
	var arr_date = str_date.split('.');
	
	if (arr_date.length==2) {arr_date[2] = new Date().getYear();};
	if (arr_date.length != 3) return cal_error ("Неверный формат даты: '" + str_date + "'.\nФормат даты должен быть dd.mm.yyyy.");
	if (!arr_date[0]) return cal_error ("Неверный формат даты: '" + str_date + "'.\nНе найдено значение дня месяца.");
	if (!RE_NUM.exec(arr_date[0])) return cal_error ("Неверный день месяца: '" + arr_date[0] + "'.\nЗначение должно быть неотрицательное целое.");
	if (!arr_date[1]) return cal_error ("Неверный формат даты: '" + str_date + "'.\nНе найдено значение месяца.");
	if (!RE_NUM.exec(arr_date[1])) return cal_error ("Неверное значение месяца: '" + arr_date[1] + "'.\nЗначение должно быть неотрицательное целое.");
	if (!arr_date[2]) return cal_error ("Неверный формат даты: '" + str_date + "'.\nНе найдено значение года.");
	if (!RE_NUM.exec(arr_date[2])) return cal_error ("Неверное значение года: '" + arr_date[2] + "'.\nЗначение должно быть неотрицательное целое.");

	var dt_date = new Date();
	dt_date.setDate(1);
	if (arr_date[1] < 1 || arr_date[1] > 12) return cal_error ("Неверное значение месяца: '" + arr_date[1] + "'.\nЗначение должно быть в пределах 01-12.");
	dt_date.setMonth(arr_date[1]-1);
	 
	if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
	dt_date.setFullYear(arr_date[2]);

	var dt_numdays = new Date(arr_date[2], arr_date[1], 0);
	dt_date.setDate(arr_date[0]);
	if (dt_date.getMonth() != (arr_date[1]-1)) return cal_error ("Неверное значение дня месяца: '" + arr_date[0] + "'.\nЗначение должно быть в пределах 01-"+dt_numdays.getDate()+".");
	return (dt_date)
}

function cal_prs_time1 (str_time, dt_date) {
	if (!dt_date) return null;
	var arr_time = String(str_time ? str_time.replace(/[\.\,\+\-\/]/gi, ":") : '').split(':');
	if (!arr_time[0]) dt_date.setHours(0);
	else if (RE_NUM.exec(arr_time[0]))
		if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);
		else return cal_error ("Неверное значение часов: '" + arr_time[0] + "'.\nЗначение должно быть в пределах 00-23.");
	else return cal_error ("Неверное значение часов: '" + arr_time[0] + "'.\nЗначение должно быть неотрицательное целое.");
	
	if (!arr_time[1]) dt_date.setMinutes(0);
	else if (RE_NUM.exec(arr_time[1]))
		if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
		else return cal_error ("Неверное значение минут: '" + arr_time[1] + "'.\nЗначение должно быть в пределах 00-59.");
	else return cal_error ("Неверное значение минут: '" + arr_time[1] + "'.\nЗначение должно быть неотрицательное целое.");

	if (!arr_time[2]) dt_date.setSeconds(0);
	else if (RE_NUM.exec(arr_time[2]))
		if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
		else return cal_error ("Неверное значение секунд: '" + arr_time[2] + "'.\nЗначение должно быть в пределах 00-59.");
	else return cal_error ("Неверное значение секунд: '" + arr_time[2] + "'.\nЗначение должно быть неотрицательное целое.");

	dt_date.setMilliseconds(0);
	return dt_date;
}

function cal_error (str_message) {
cal_error_str = str_message;
return null;
}

function CheckTime(title, obj) {
if (!CheckTime2(obj.value))	{
FocusObject(obj);
alert ('Ошибка в поле ' + title + '\n' + cal_error_str);
return false}
return true;
}

function CheckTime2(str_datetime) {
var arr_datetime = str_datetime.split(' ');
return (cal_prs_time1(arr_datetime[1], cal_prs_date1(arr_datetime[0]))) 
}

function CheckTimeRange(title, obj) {
var str_datetime = obj.value;
var arr_datetime = str_datetime.split('-');
var r_val = CheckTime2(trim(arr_datetime[0]));
if (arr_datetime.length>1) {r_val = (r_val && CheckTime2(trim(arr_datetime[1]))); };
if (!r_val) {
FocusObject(obj);
alert ('Ошибка в поле ' + title + '\n' + cal_error_str);
return false }
return true;
}

function CheckTimeBetween(title, obj, startDate, endDate) {
var d=CheckTime2(obj.value);
if (!d) {
FocusObject(obj);
alert ('Ошибка в поле ' + title + '\n' + cal_error_str);
return false } 
else {
if ((d.valueOf()/(60*60*24*1000)>startDate) && (d.valueOf()/(60*60*24*1000)<endDate)) {return true} else {
var sd = new Date(startDate*60*60*24*1000);
var ed = new Date(endDate*60*60*24*1000);
FocusObject(obj);
alert('Значение даты поля '+title+'должно быть между ' + sd.getDate()+'.'+(sd.getMonth()+1)+'.'+sd.getFullYear()+' и '+ed.getDate()+'.'+(ed.getMonth()+1)+'.'+ed.getFullYear());
return false}
}
}

