//  Короткая запись года XX, меньшая этой константы, превратится в 19XX, иначе - в 20XX
var ShortYearRange = 30;
var tyear, tmonth, tday, thour, tminute;

/***********************************************************************/
/*		функция проверки корректности даты

		m_error = check_date(str_date, format_date)

			str_date 		- строка содержащая дату для проверки

			format_date 		- шаблон формата даты. Примеры значений:
				"dd.mm.yy" ; "dd/mm/yy" ; "dd.mm.yy hh:mm", "dd.mm.yy [hh:mm]"
				"mm/dd/yy"

			m_error = 0  - если строка соответствует шаблону.
				= 1 -  если строка соответствует шаблону, но дата не корректна (32.01.2000)
				= 2 - если строка не соответствует шаблону
				= 3 - если шаблон задан не корректно

	Примечание:
		В качестве символов в шаблоне могут быть только "d","m", "y", "h" (или большие буквы "D","M"...) . В качестве разделителей полей даты могут быть ".","/",	"\".  В качестве разделитей полей времени может быть только ":". Других символов в шаблоне быть не может.
	"dd.mm.yy" - означает, что время вводить нельзя.
	"dd.mm.yy hh:mm" - означает, что время вводится обязательно.
	"dd.mm.yy [hh:mm]" - означает, что время можно вводить, а можно не вводить.

	Для формата "dd.mm.yy" корректными  значениями, например, будут "01.05.00"; "1.5.00"; "01.5.2000", а некорректным "01/05/2000". Т.е. кол-во символов в числе и месяце может варьироваться 1 или 2, в годе 2 или 4, а разделитель должен строго соответствовать шаблону.
	Кол-во символов в представлении часов и минут должно быть по 2.
	Шаблоны "d.mm.yy" или "dd.m.yy" и им подобные для упроощения задачи можно считать некорректными, т.к. на практике они вряд ли будут использоваться.
*/

/***********************************************************************/
function check_date(dat, fmt)
{
  var n, m;
  var tmp, re, opt, ord;

  fmt = fmt.toUpperCase();

//------------------- check for error symbols

  re = /[^DMYH\\\/. :\[\]]/g;
  if(re.test(fmt)) return 3;

//------------------- shrink spaces

  re = /\s+/g; fmt = fmt.replace(re, ' ');

//------------------- 'dd.mm.yy hh:mm' -> 'd.m.y h:n'

  re = /\[\s*HH\s*:\s*MM\s*\]/;  fmt = fmt.replace(re, '[h:n]');
  re = /HH\s*:\s*MM/;  fmt = fmt.replace(re, 'h:n');
  re = /DD/;  fmt = fmt.replace(re, 'd');
  re = /MM/;  fmt = fmt.replace(re, 'm');
  re = /YY/;  fmt = fmt.replace(re, 'y');
  re = /yYY/;  fmt = fmt.replace(re, 'y');

  re = /H/g; if(re.test(fmt)) return 3;
  re = /D/g; if(re.test(fmt)) return 3;
  re = /M/g; if(re.test(fmt)) return 3;
  re = /Y/g; if(re.test(fmt)) return 3;

//------------------- '[h:n]' -> 'H:N'

  re = /\[h:n\]/;  fmt = fmt.replace(re, 'H');

//------------------- check branches

  if(fmt.indexOf('\[') >=0 || fmt.indexOf('\]') >= 0) return 3;

//------------------- remember order

  re = /[\\\/. :]/g; ord = fmt.replace(re, '');

//------------------- trim pattern

  re = /^\s*(.+)\s*$/; fmt = (fmt.match(re))[1];

//------------------- prepare check pattern

  re = /\\/g; fmt = fmt.replace(re, '\\s*\\\\\\s*');
  re = /\//g; fmt = fmt.replace(re, '\\s*\\\/\\s*');
  re = /\./g; fmt = fmt.replace(re, '\\s*\\.\\s*');
  re = /:/g; fmt = fmt.replace(re, '\\s*:\\s*');
  re = /\s+/g; fmt = fmt.replace(re, '\\s+');

  re = /[dmh]/g; fmt = fmt.replace(re, '(\\d{1,2})');
  re = /[n]/g; fmt = fmt.replace(re, '(\\d\\d)');
  re = /[y]/g; fmt = fmt.replace(re, '(\\d{2,4})');
  re = /H/g; fmt = fmt.replace(re, '(\\d+\\s*:\\s*\\d\\d)*');

  dat = ' ' + dat + ' ';

//------------------- get & check date/time data

  var day=1, month=1, year=2000, hour=0, minute=0;

  re = new RegExp('^\\s*' + fmt + '\\s*$', '');
  tmp = dat.match(re);

  if(tmp != null) {

    for(n = 0, m = 1; n < ord.length; n++) {
      switch(ord.charAt(n)) {
        case 'd':
                  day = parseInt(tmp[m++],10); break;
        case 'm':
                  month = parseInt(tmp[m++],10); break;
        case 'y':
                  year = parseInt(tmp[m++],10); break;
        case 'h':
                  hour = parseInt(tmp[m++],10); break;
        case 'n':
                  minute = parseInt(tmp[m++],10); break;
        case 'H':
                  re = /(\d+)\s*:\s*(\d\d)/;
                  if(re.test(tmp[m])) {
                    hour = parseInt(RegExp.$1,10);
                    minute = parseInt(RegExp.$2,10);
                    m++;
                  }
                  else {
                    m++;
                  }
      }
    }

//------------------- check day, month, year, hour, minute

    if(year < 100) year += 2000;
    if(day < 1 || month < 1 || month > 12 || year > 9999) return 1;
    if(day > (new Array(0,31,29,31,30,31,30,31,31,30,31,30,31))[month]) return 1;
    if(month == 2) {
      if(!(year % 4 == 0 && !(year % 100 == 0 && year % 400 != 0))) {
        if(day > 28) return 1;
      }
    }
    if(hour < 0 || hour > 23 || minute < 0 || minute > 59) return 1;

      tyear = year;
      tmonth = month;
      tday = day;
      thour = hour;
      tminute = minute;
      return 0;

    return 0;
  }

  return 2;
}
// end of function check_date





/***********************************************************************/
// функция преобразования даты к строке (для загрузки значения поля даты в форму)
//
//			mdate 			- дата которую требуется преобразовать в строку
//			format_date 		- шаблон формата даты. Cм. выше
//

function date_to_str(mdate, format_date_in)
{
  function right(str, len)
  {
    return str.substring(str.length - len, str.length);
  }

	var re, n, fl, format_date = format_date_in;

	format_date = format_date.toUpperCase();

	re = /[^DMYH\\\/. :]/;
	if(re.test(format_date)) return '';

	// Меням обозначение минут на NN

	re = /:(\s*)MM/;
	re.test(format_date);
	format_date = format_date.replace(/:(\s*)MM/, ':' + RegExp.$1 + 'NN');

	format_date = format_date.replace(/HH/, 'h');
	format_date = format_date.replace(/NN/, 'n');
	format_date = format_date.replace(/YY/g, 'y');
	format_date = format_date.replace(/yy/, 'z');
	format_date = format_date.replace(/MM/, 'm');
	format_date = format_date.replace(/DD/, 'd');
	format_date = format_date.replace(/M/, 'k');
	format_date = format_date.replace(/D/, 'c');

	if(/[DMYH]/.test(format_date)) return '';

	format_date = format_date.replace(/z/, '' + mdate.getFullYear());
	format_date = format_date.replace(/y/, right('0000' + mdate.getFullYear(), 2));
	format_date = format_date.replace(/m/, right('00' + (mdate.getMonth() + 1), 2));
	format_date = format_date.replace(/d/, right('00' + mdate.getDate(), 2));
	format_date = format_date.replace(/k/, '' + (mdate.getMonth() + 1));
	format_date = format_date.replace(/c/, '' + mdate.getDate());
//	format_date = format_date.replace(/h/, right('00' + mdate.getHours(), 2));
//	format_date = format_date.replace(/n/, right('00' + mdate.getMinutes(), 2));

	return format_date;
}

/***********************************************************************/
//  функция преобразования строки к дате (строке)
//
//			str_date 		- строка содержащая дату для преобразования
//			format_date 		- шаблон формата даты. Cм. выше

function str_to_date(str_date, format_date)
{
	var res;

	res = check_date(str_date, format_date);
	if(res == 0) {
		return new Date(tyear, tmonth - 1, tday, thour, tminute);
	}

	return new Date();
}

/***********************************************************************/
// Ф-ция которая вешается на событие нажатия кнопочки около календаря !!
function CalendarEvent(objDateD, objDateM, baseM, objDateY, baseY, objDateW, Ln, format_date, calendar_path) {
  switch (Ln)
  {
    case 1:  dowArray = new Array("Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"); break;
    case 2:  dowArray = new Array("Lu", "Ma", "Mi", "Jo", "Vi", "Sa", "Du"); break;
    case 3:  dowArray = new Array("Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"); break;
    case 4:  dowArray = new Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); break;
    default: dowArray = new Array("Lu", "Ma", "Mi", "Jo", "Vi", "Sa", "Du"); break;
  }
  var objDate;
  strDate = (objDateD.selectedIndex+1) + '.' + (objDateM.selectedIndex+baseM) + '.' + (objDateY.selectedIndex+baseY);
  var dDate= new Date()
  dDate = str_to_date(strDate, format_date);

//  dDate = 'DDD';
  var res=window.showModalDialog(calendar_path, dDate, "dialogWidth:201px; dialogHeight:190px; menubar=no; status=no; help=no; location:no; ")
//	var res = window.open( calendar_path, null, 'left='+Math.ceil((window.screen.width-650)/2)+', top=' + Math.ceil((window.screen.height-600)/2)+', width=430, height=490, toolbar=yes, status=yes, menubar=yes, scrollbars=yes, resizable=yes')
//	res.focus();

















  if(res != null)
  {
	strDate = date_to_str(new Date(res), format_date);
    dDate = str_to_date(strDate, format_date);
	objDateD.selectedIndex = strDate.substr(0,2)-1;
	objDateM.selectedIndex = strDate.substr(3,2)-baseM;
	objDateY.selectedIndex = strDate.substr(6,4)-baseY;
    objDateW.value = dowArray[dDate.getDay()];
  }
}


/***********************************************************************/
function wday_change(ddd, objWD, Ln)
{
  switch (Ln)
  {
    case 1:  dowArray = new Array("вс", "пн", "вт", "ср", "чт", "пт", "сб"); break;
    case 2:  dowArray = new Array("Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa"); break;
    case 3:  dowArray = new Array("Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"); break;
    case 4:  dowArray = new Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); break;
    default: dowArray = new Array("Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sa"); break;
  }
  dDate = str_to_date(ddd, 'dd.mm.yyyy');
  objWD.value = dowArray[Ln, dDate.getDay()];
}