var CALENDAR_YEAR_FROM = 1970;
var CALENDAR_YEAR_TO = 2070;
var CALENDAR_DAYS_NAMES = new Array('Пн','Вт','Ср','Чт','Пт','Сб','Вс');
var CALENDAR_MONTHS_NAMES = new Array('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');



var cHydraCalendar = function()
{
    this.calendar_body = false;
    this.parent_elem = false;

    /**
     * Объект кнопки открытия редактора.
     *
     * @var object
     */
    this.this_obj = false;
}


cHydraCalendar.prototype.init = function()
{
    if (!this.exists())
    {
	this.calendar_body = this.create_calendar();    
    }
}

cHydraCalendar.prototype.exists = function()
{
    if (this.calendar_body)
    {
	return true;    
    }
    return false;
}


cHydraCalendar.prototype.create_calendar = function()
{
    var calendar_body = document.createElement('div');
    calendar_body.setAttribute('id','calendar');
    calendar_body.style.position = 'absolute';

	
    var button = document.createElement('button');
    button.className = 'return';
    button.innerHTML = 'Вставить';
    button.onclick = return_date_calendar;
    calendar_body.appendChild(button);

    var label = document.createElement('label');
    label.setAttribute('id','calendar_data_text');
    calendar_body.appendChild(label);

    var button = document.createElement('button');
    button.className = 'clear';
    button.innerHTML = 'Очистить';
    button.onclick = clear_date_calendar;
    calendar_body.appendChild(button);

    var button = document.createElement('button');
    button.innerHTML = 'X';
    button.onclick = close_calendar;
    calendar_body.appendChild(button);
    calendar_body.appendChild(document.createElement('br'));

    calendar_body.appendChild(this.create_select_month());

    calendar_body.appendChild(this.create_select_year());
    
        var input_hours = document.createElement('input');
		input_hours.className = 'calendar_hours';
		input_hours.id = 'calendar_hours';
		input_hours.onchange = select_hour_onchange;
		input_hours.setAttribute('maxlength', 2);
		input_hours.type = 'text';
		input_hours.name = 'hours';
		var input_minutes = document.createElement('input');
		input_minutes.className = 'calendar_minutes';
		input_minutes.id = 'calendar_minutes';
		input_minutes.onchange = select_minute_onchange;
		input_minutes.name = 'minutes';
		input_minutes.type = 'text';
		input_minutes.setAttribute('maxlength', 2);

		//div_time.className = 'calendar_time';
		//div_time.id = 'calendar_time';
        calendar_body.appendChild(input_hours);
		calendar_body.appendChild(document.createTextNode(':'));
		calendar_body.appendChild(input_minutes);
        //calendar_body.appendChild(div_time);
		
        calendar_body.appendChild(this.create_select_day());
		

		
	document.body.appendChild(calendar_body);
    //make_elem_drag_n_drop(calendar_body);
	return calendar_body;
}

cHydraCalendar.prototype.draw = function()
{
	this.calendar_body.style.display = 'block';

    this.calendar_body.style.left = hydra_elem_offset_x(this.this_obj) + this.this_obj.offsetWidth + 'px';
    this.calendar_body.style.top = hydra_elem_offset_y(this.this_obj) + 'px';
}

cHydraCalendar.prototype.set_date = function(year, month, day, hour, minute)
{
	this.calendar_body.setAttribute('year', year);
	this.calendar_body.setAttribute('month', month);
	this.calendar_body.setAttribute('day', day);
	this.calendar_body.setAttribute('hour', hour);
	this.calendar_body.setAttribute('minute', minute);
	
	this.refresh();
}

cHydraCalendar.prototype.close = function()
{
	this.calendar_body.style.display = 'none';
}

cHydraCalendar.prototype.refresh = function()
{
	
	//������� �������� ���������
	var year = this.calendar_body.getAttribute('year');
	var month = this.calendar_body.getAttribute('month');
	var day = this.calendar_body.getAttribute('day');
	var hour = this.calendar_body.getAttribute('hour');
	var minute = this.calendar_body.getAttribute('minute');

	//������������ �������� � ��������� �������
	var label = document.getElementById('calendar_data_text');

	
	label.innerHTML = this.get_date();

	//������������ �������� ����
	var select_year = document.getElementById('calendar_select_year');
	select_year.value = year;

	//������������ �������� ������
	var select_month = document.getElementById('calendar_select_month');
	select_month.value = month;
	
	//������� ���� ������ ��� ����
	select_day = document.getElementById('calendar_select_day');
	select_day.innerHTML = '';
	
	//������� � ���� ������ �������� (��� ������� �� ��������� � ����� ������ �� ������ � ��� ������)
	var first_day_number = this.day_on_week(year,month,1);
	for (var i = 1; i < first_day_number; i++) 
	{
		var select_day_item = document.createElement('div');
		select_day_item.className = 'calendar_column_'+i;
        select_day.appendChild(select_day_item);
	}
	
	//������� � ���� ��� �������� ������
	var day_count = this.days_in_month(year,month);
    var j = i-2;
	for (var i = 1; i <= day_count; i++) 
	{
		var select_day_item = document.createElement('div');
		select_day_item.setAttribute('value',i);
		select_day_item.innerHTML = i;
		select_day_item.className = 'calendar_column_'+((i+j)%7+1);
		select_day_item.onclick = select_day_onchange;
		if(i == day) 
		{
			select_day_item.className = 'calendar_day_change'; 
		}
		select_day.appendChild(select_day_item);
	}
    document.getElementById('calendar_hours').value = hour;
    document.getElementById('calendar_minutes').value = minute;

}

cHydraCalendar.prototype.days_in_month = function(year, month)
{
	return new Date(year, month + 1-1, 0).getDate();
}


cHydraCalendar.prototype.day_on_week = function(year, month, day)
{
	var day = new Date(year, month-1, day).getDay();
	if(day == 0) 
	{
		day = 7;
	}
	return day;
}


cHydraCalendar.prototype.set_year = function(year)
{
	this.calendar_body.setAttribute('year', year);
}

cHydraCalendar.prototype.set_month = function(month)
{
	this.calendar_body.setAttribute('month', month);
}

cHydraCalendar.prototype.set_day = function(day)
{
	this.calendar_body.setAttribute('day', day);
}
cHydraCalendar.prototype.set_hour = function(hour)
{
	this.calendar_body.setAttribute('hour', hour);
}
cHydraCalendar.prototype.set_minute = function(minute)
{
	this.calendar_body.setAttribute('minute', minute);
}

cHydraCalendar.prototype.create_select_year = function()
{

	//������ ���� �������
	var select_year = document.createElement('select');
	select_year.setAttribute('id','calendar_select_year');
	select_year.onchange = select_year_onchange;
	
	//������ ������
	for (var i = CALENDAR_YEAR_FROM; i <= CALENDAR_YEAR_TO; i++) 
	{
		var select_year_item = document.createElement('option');
		select_year_item.setAttribute('value',i);
		select_year_item.innerHTML = i;
		select_year.appendChild(select_year_item);
	}

	return select_year;
}

cHydraCalendar.prototype.create_select_month = function()
{
	//������ ���� �������
	var select_month = document.createElement('select');
	select_month.setAttribute('id','calendar_select_month');
	select_month.onchange = select_month_onchange;

	//������ ������
	for (var i = 1; i <= 12; i++) 
	{
		var select_month_item = document.createElement('option');
		select_month_item.setAttribute('value',i);
		select_month_item.innerHTML = CALENDAR_MONTHS_NAMES[i-1];
		select_month.appendChild(select_month_item);
	}

	return select_month;
}

cHydraCalendar.prototype.create_select_day = function()
{
	var container = document.createElement('div');
	
	// �������� ���� �������� ���� ������ 
	var day_names = document.createElement('div');
	day_names.className = 'calendar_day_names';

	for (var i = 0; i < 7; i++) 
	{
		var day_name = document.createElement('div');
		day_name.innerHTML = CALENDAR_DAYS_NAMES[i];
		day_name.className = 'calendar_column_'+(i+1);
		day_names.appendChild(day_name);
	}
	
	//�������� ���� ������ ���� ������
	var select_day = document.createElement('div');
	select_day.setAttribute('id','calendar_select_day');
	select_day.className = 'calendar_select_day';

	container.appendChild(day_names);
	container.appendChild(select_day);
	return container;
}

cHydraCalendar.prototype.set_parent_elem = function(elem)
{
	this.parent_elem = elem;
}

cHydraCalendar.prototype.return_date = function()
{
    
	var date = this.get_date();
	hydra_calendar.parent_elem.value = date;
    eval(this.jscode);

}

cHydraCalendar.prototype.get_date = function()
{
	var year = this.calendar_body.getAttribute('year');
	var month = this.calendar_body.getAttribute('month');
	var day = this.calendar_body.getAttribute('day');
	var hour = this.calendar_body.getAttribute('hour');
	var minute = this.calendar_body.getAttribute('minute');

	var date_text = '';

	var pattern = /^(\d)$/;


	if(pattern.test(day)) 
	{
		day = '0'+day;
	}

	
	if(pattern.test(month)) 
	{
		month = '0'+month;
	}

	date_text = day + "." + month + "." + year + ' ' + hour + ':' + minute;
	
	return  date_text;
}


function select_year_onchange()
{
	hydra_calendar.set_year( this.value );
	hydra_calendar.refresh();
}


function select_month_onchange()
{
	hydra_calendar.set_month( this.value );
	hydra_calendar.refresh();
}

function select_day_onchange()
{
	hydra_calendar.set_day( this.getAttribute('value') );
	hydra_calendar.refresh();
}
function select_hour_onchange()
{
	hydra_calendar.set_hour( this.value );
	hydra_calendar.refresh();
}
function select_minute_onchange()
{
	hydra_calendar.set_minute( this.value );
	hydra_calendar.refresh();
}


hydra_calendar = new cHydraCalendar();

/**
 * Функция для отображения календаря.
 *
 * @param object obj_id
 * @param string jscode
 */
function show_calendar(obj_id, jscode, this_obj)
{

	
	/*
		var params = new Array();
		params['x'] = 0;
		params['y'] = 0;
		get_elem_position(this_obj, params);
		alert(params);*/

    var obj = document.getElementById(obj_id);
    hydra_calendar.this_obj = this_obj;
    hydra_calendar.init();
    hydra_calendar.draw();
 
    var pattern = /(\d\d)\.(\d\d)\.(\d\d\d\d) (\d\d):(\d\d)/;

    if (pattern.test(obj.value))
    {
	hydra_calendar.set_date(RegExp.$3, RegExp.$2, RegExp.$1, RegExp.$4, RegExp.$5);  
    }
    else
    {
	var my_date = new Date();

	if(getNameBrouser() == 'gecko')
        {
            hydra_calendar.set_date(1900+my_date.getYear(), my_date.getMonth()+1, my_date.getDate(), my_date.getHours(), my_date.getMinutes());
        }
		
        
        if(getNameBrouser() == 'msie')
        {
            hydra_calendar.set_date(my_date.getYear(), my_date.getMonth()+1, my_date.getDate(), my_date.getHours(), my_date.getMinutes());
        }

        
	}

	hydra_calendar.input_elem = obj;
	hydra_calendar.set_parent_elem(obj);
    if (typeof jscode == "undefined") jscode = "";
	hydra_calendar.jscode = jscode;
}

function close_calendar()
{
	hydra_calendar.close();
}

function return_date_calendar()
{
	hydra_calendar.return_date();
	hydra_calendar.close();
}
function clear_date_calendar()
{
    hydra_calendar.input_elem.value='';
    hydra_calendar.close();
}




/*------------------------------------------*/
function show_calendar1(obj)
{
	var calendar_body = document.getElementById('calendar');
	
	if(!calendar_body) 
	{
		calendar_body = create_calendar();
	}
	
	calendar_body.style.display = 'block';

    calendar_body.style.top = event.clientY - 10 + document.body.scrollTop;
	calendar_body.style.left = event.clientX - 10 + document.body.scrollLeft;
	
	calendar_set_date(2007,6,1);
}

function create_calendar()
{
	var calendar_body = document.createElement('div');
	calendar_body.setAttribute('id','calendar');
	calendar_body.style.position = 'absolute';
	calendar_body.appendChild(create_select_year());
	calendar_body.appendChild(create_select_month());
	calendar_body.appendChild(create_select_day());
	
	document.body.appendChild(calendar_body);
	
	return calendar_body;
}



function calendar_set_date(year,month,day)
{
	var calendar = document.getElementById('calendar');
	calendar.setAttribute('year',year);
	calendar.setAttribute('month',month);
	calendar.setAttribute('day',day);
	
	refresh_calendar();
}


function refresh_calendar()
{
	
	//������� �������� ���������
	var calendar = document.getElementById('calendar');
	var year = calendar.getAttribute('year');
	var month = calendar.getAttribute('month');
	var day = calendar.getAttribute('day');

	//������������ �������� ����
	var select_year = document.getElementById('calendar_select_year');
	select_year.value = year;

	//������������ �������� ������
	var select_month = document.getElementById('calendar_select_month');
	select_month.value = month;
	
	//������� ���� ������ ��� ����
	select_day = document.getElementById('calendar_select_day');
	select_day.innerHTML = '';
	
	//������� � ���� ������ �������� (��� ������� �� ��������� � ����� ������ �� ������ � ��� ������)
	var first_day_number = calendar_day_on_week(year,month,1);
    for (var i = 1; i < first_day_number; i++) 
	{
		var select_day_item = document.createElement('div');
		select_day.appendChild(select_day_item);
	}
	
	//������� � ���� ��� �������� ������
	var day_count = calendar_days_in_month(year,month);
	for (var i = 1; i <= day_count; i++) 
	{
		var select_day_item = document.createElement('div');
		select_day_item.setAttribute('value',i);
		select_day_item.innerHTML = i;
		select_day.appendChild(select_day_item);
	}

}




function select_year_onchange1()
{
	var calendar = document.getElementById('calendar');
	calendar.setAttribute('year',this.value);
	refresh_calendar();
}

function select_month_onchange1()
{
	var calendar = document.getElementById('calendar');
	calendar.setAttribute('month',this.value);
	refresh_calendar();
}






function create_select_year()
{
	//������ ���� �������
	var select_year = document.createElement('select');
	select_year.setAttribute('id','calendar_select_year');
	select_year.onchange = select_year_onchange;
	//������ ������
	for (var i = CALENDAR_YEAR_FROM; i <= CALENDAR_YEAR_TO; i++) 
	{
		var select_year_item = document.createElement('option');
		select_year_item.setAttribute('value',i);
		select_year_item.innerHTML = i;
		select_year.appendChild(select_year_item);
	}

	return select_year;
}


function create_select_month()
{
	//������ ���� �������
	var select_month = document.createElement('select');
	select_month.setAttribute('id','calendar_select_month');
	select_month.onchange = select_month_onchange;

	//������ ������
	for (var i = 1; i <= 12; i++) 
	{
		var select_month_item = document.createElement('option');
		select_month_item.setAttribute('value',i);
		select_month_item.innerHTML = CALENDAR_MONTHS_NAMES[i-1];
		select_month.appendChild(select_month_item);
	}

	return select_month;
}


function create_select_day()
{
	var container = document.createElement('div');
	
	var day_names = document.createElement('div');
	day_names.className = 'calendar_day_names';
	for (var i = 0; i < 7; i++) 
	{
		var day_name = document.createElement('div');
		day_name.innerHTML = CALENDAR_DAYS_NAMES[i];
        //day_name.className = ''+i;
        //day_name.setAttribute('id','asd'+i);
		day_names.appendChild(day_name);
	}
	
	var select_day = document.createElement('div');
	select_day.setAttribute('id','calendar_select_day');
	select_day.className = 'calendar_select_day';

	container.appendChild(day_names);
	container.appendChild(select_day);
	return container;
}




function calendar_days_in_month(year,month)
{
	return new Date(year, month + 1-1, 0).getDate();
}

function calendar_day_on_week(year,month,day)
{
	var day = new Date(year, month-1, day).getDay();
	if(day == 0) 
	{
		day = 7;
	}
	return day;
}

function getNameBrouser() {
 var ua = navigator.userAgent.toLowerCase();
 // Определим Internet Explorer
 if (ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1) {
   return "msie"
 }
 // Opera
 if (ua.indexOf("opera") != -1) {
   return "opera"
 }
 // Gecko = Mozilla + Firefox + Netscape
 if (ua.indexOf("gecko") != -1) {
   return "gecko";
 }
 // Safari, используется в MAC OS
 if (ua.indexOf("safari") != -1) {
   return "safari";
 }
 // Konqueror, используется в UNIX-системах
 if (ua.indexOf("konqueror") != -1) {
   return "konqueror";
 }
 return "unknown";
}






function get_elem_position(elem, params)
{

	params['x'] = elem.offsetLeft + params['x'];
	params['y'] = elem.offsetTop + params['y'];
	if (elem.nodeName != 'BODY')
	{
		get_elem_position(elem.parentNode, params);
	}
}