//------------------------------------------------------------------------
// Преобразование Даты вида ДД.ММ.ГГГГ в дату вида YYYY/MM/DD
function ToSQLDate(Element)
{var MyDate = "" + Element,MyArray;


	if(MyDate.indexOf('.') != -1)
	{
		MyArray = MyDate.split('.');
		MyDate = MyArray[2] + "/" + MyArray[1] + "/" + MyArray[0] ;
	}
	return MyDate;
		
}
//------------------------------------------------------------------------
// Преобразование Даты вида YYYY/MM/DD в дату вида ДД.ММ.ГГГГ
function ToEuroDate(Element)
{var MyDate = Element,MyArray;
	if(MyDate.indexOf('/') != -1)
	{
		MyArray = MyDate.split('/');
		MyDate = MyArray[2] + "." + MyArray[1] + "." + MyArray[0];
	}
	return MyDate;
	
}
//  Короткая запись года XX, меньшая этой константы, превратится в 19XX, иначе - в 20XX
var ShortYearRange = 30;
var tyear, tmonth, tday, thour, tminute;

//  Короткая запись года 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 DateDiff(interval, date1, date2, format_date) 
{

var SECOND = 1000; // the number of milliseconds in a second
var MINUTE = SECOND * 60; // the number of milliseconds in a minute
var HOUR = MINUTE * 60; // the number of milliseconds in an hour
var DAY = HOUR * 24; // the number of milliseconds in a day
var WEEK = DAY * 7; // the number of milliseconds in a week

if (check_date(date1, format_date)!=0 || check_date(date2, format_date)!=0) return;
var sign=1;
	
  var nDate = str_to_date(date1, format_date); // current date (local)
  var dDate = str_to_date(date2, format_date); // current date (local)
	
	if(dDate < nDate)  
	{
		sign = -1;
		var tmp = dDate;
		dDate = nDate;
		nDate = tmp;
	}

  var nTime = nDate.getTime(); // current time (UTC)
  var dTime = dDate.getTime(); // specified time (UTC)
  var bTime = Math.abs(nTime - dTime)  // time difference
  var ret;

  switch(interval.toLowerCase())
  {
  	case "day": 
  	case "d": 
		ret = Math.round(bTime / DAY);
		break;
  	case "week": 
  	case "w": 
		ret = Math.round(bTime / WEEK);
		break;
  	case "hour": 
  	case "h": 
		ret = Math.round(bTime / HOUR);
		break;
  	case "sec": 
  	case "s": 
		ret = Math.round(bTime / SECOND);
		break;
  }

  return ret*sign;
}

/***********************************************************************/
// Ф-ция которая вешается на событие нажатия кнопочки около календаря !!
//       Чудесная  ф-ция !
function Calendar(objDate, format_date, calendar_path) {  
	// ObjDate - объект <INPUT> откуда считывается и записывается значение даты до и после работы с календарем соответственно
	// format_date - формат представления даты. см. выше, (пример "dd.mm.yy")
	// Calendar_path - Путь где находится календарь, (пример "/include/dlgCalendar.htm")
  var dDate= new Date()			
  dDate = str_to_date(objDate.value,format_date)
  var res=window.showModalDialog(calendar_path,dDate,"dialogWidth:200px;dialogHeight:205px;center:yes;help:no;status:no;scroll:no;");
  if(res != null) {objDate.value = date_to_str(new Date(res),format_date);}
}

//----------------------------------------------------------------------------------
function CalcDateByCount(Count, From, To)
{

	if(From.value =="") return;
	if(check_date(From.value, "dd.mm.yyyy")!=0) From.value = date_to_str(new Date, "dd.mm.yyyy");

	var d =str_to_date(From.value, "dd.mm.yyyy");
	var count = parseInt(Count.value);

	
	
	if (!isNaN(count))
	{
		d.setDate(d.getDate()+count);
		To.value = date_to_str(d, "dd.mm.yyyy");
	}
	else
	{
	alert('Sorry! Number is incorrect!');
	Count.value = 0;
	To.value = date_to_str(d, "dd.mm.yyyy");
	}

}
//----------------------------------------------------------------------------------
function CalcDateByFrom(Count, From, To)
{
	if(From.value =="") return;

	if(check_date(From.value, "dd.mm.yyyy")!=0) From.value = date_to_str(new Date, "dd.mm.yyyy");
	if(check_date(To.value, "dd.mm.yyyy")!=0) To.value = date_to_str(new Date, "dd.mm.yyyy");
	Count.value = DateDiff('d', From.value, To.value, "dd.mm.yyyy");
	CalcDateByCount(Count, From, To);
}

