function getBodyScrollTop()
{
  return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getBodyScrollLeft()
{
  return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}

months = new Array('январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
days_of_week = new Array ('Пн','Вт','Ср','Чт','Пт','Сб','Вс');
holidays = [[1,1],[1,2],[1,3],[1,4],[1,5],[1,7],[2,23],[3,8],[5,1],[5,9],[6,12],[11,4]];
	
var Calendar = function (Calendar_id,inner_div,ret_data,from,to,selected)
{
	this.ID = Calendar_id || 'CAL';
	this.ID_pref = this.ID+'_';
	this.inner_div = inner_div || null;
	this.from = from || new Array();
	this.to = to || new Array();
	this.selected = selected || new Array();
	this.ret_data = ret_data || null;
	
	if (this.selected[0] == null) 
	{
		date = new Date();
		this.selected = [date.getFullYear(),date.getMonth()+1,date.getDate()];
	}
}


Calendar.prototype.call = function (event)
{
	if (this.ret_data != null)
	{
		var rd = document.getElementById(this.ret_data);
		var dateField = rd.value;
		var curDate = dateField.split(".");
		this.selected[0] = curDate[2];
		this.selected[1] = curDate[1];
		this.selected[2] = curDate[0];
	}
	
	var indiv = document.getElementById(this.inner_div);
	var posX = event.clientX+getBodyScrollLeft()-10+'px';
	var posY = event.clientY+getBodyScrollTop()-10+'px';
	indiv.style.left = posX;
	indiv.style.top = posY;
	this.draw();
	indiv.style.display = 'block';
}

Calendar.prototype.show = function (left,top)
{
	if (this.ret_data != null)
	{
		var rd = document.getElementById(this.ret_data);
		var dateField = rd.value;
		var curDate = dateField.split(".");
		this.selected[0] = curDate[2];
		this.selected[1] = curDate[1];
		this.selected[2] = curDate[0];
	}
	
	var indiv = document.getElementById(this.inner_div);
	var posX = left+'px';
	var posY = top+'px';
	indiv.style.left = posX;
	indiv.style.top = posY;
	this.draw();
	indiv.style.display = 'block';
}

Calendar.prototype.changeyearmonth = function (i)
{
	this.selected[0] = this.month_year_array[i]['year'];
	this.selected[1] = this.month_year_array[i]['month'];
	this.draw();
}

Calendar.prototype.set_data = function (day)
{
	var ret_data = document.getElementById(this.ret_data);
	ret_data.value = day+'.'+this.selected[1]+'.'+this.selected[0];
	var indiv = document.getElementById(this.inner_div);
	indiv.style.display = 'none';
}

Calendar.prototype.draw = function ()
{
	var ID = this.ID;
	var pref = this.ID_pref;
	var inner_div = this.inner_div || null;
	
	var this_month = new Date(this.selected[0], this.selected[1]-1, 1);
	var next_month = new Date(this.selected[0], this.selected[1], 1);
	var prev_month = this.selected[1] - 2;

	var first_week_day = this_month.getDay();
	if (first_week_day == 0) first_week_day = 6; else first_week_day--;

	days_in_this_month = Math.floor((next_month.getTime() - this_month.getTime()) / (1000 * 60 * 60 * 24));
	
	if (this.selected[1] == 3) days_in_this_month++;
	
	calendar_html = "<a href=javascript:invert_display('"+this.inner_div+"');><img align=right border=0 src=/templates/browse/image/close.gif></a>";
	calendar_html += '<table cellspacing="0" celpadding="0" border="0" class="Calendar_main_table">';

	var days_of_week_line = '';
	
	for (var i=0;i<days_of_week.length;i++)
	{
		days_of_week_line += '<td class="Calendar_days_of_week_td">'+days_of_week[i]+'</td>';
	}
	calendar_html += '<tr class="Calendar_days_of_week_tr">'+days_of_week_line+'</tr>';

	var first_empty_days_of_week = '';
	
	for(week_day = 0; week_day < first_week_day; week_day++)
	{
		if (week_day == first_week_day-1) var brc = 'bd_right bd_bottom';
		else var brc = 'bd_bottom';
		first_empty_days_of_week += '<td class="Calendar_fisrt_empty_days_td '+brc+'">&nbsp;</td>';
	}
	
	calendar_html += '<tr class="Calendar_days_tr">'+first_empty_days_of_week;
	
	var first_line = 0;
	cur_week_day = first_week_day;
	
	var is_exi = 'Y';
	if (this.from[0] > this.selected[0]||this.to[0] < this.selected[0]) var is_exi = 'N';
	else if (this.from[0] == this.selected[0] && this.from[1]> this.selected[1]) var is_exi = 'N';
	else if (this.to[0] == this.selected[0] && this.to[1] < this.selected[1]) var is_exi = 'N';
	
	for (day_counter = 1; day_counter <= days_in_this_month; day_counter++)
	{
		week_day = cur_week_day % 7;
		if (week_day == 0) calendar_html += '</tr><tr class="Calendar_days_tr">';

		var is_hol = 'N';
		for (var k=0;k<holidays.length;k++)
		{
			if (holidays[k][0]==this.selected[1] && holidays[k][1]==day_counter)
			{
				is_hol = "Y";
				break;
			}
		}
		
		if (this.from[1] == this.selected[1] && this.from[0] == this.selected[0] && this.from[2] > day_counter) var is_exi = 'N';
		else if (this.to[1] == this.selected[1] && this.to[0] == this.selected[0] && this.to[2] < day_counter) var is_exi = 'N';
		else var is_exi = 'Y';

		var brc = 'bd_bottom bd_right';
		
		if (day_counter+first_week_day <= 7) brc += ' bd_top';
		if (week_day == 0)  brc += ' bd_left';
		
		if (this.selected[2] == day_counter) calendar_html += '<td class="Calendar_current_day_td '+brc+'"><a class="Calendar_current_day_a" href="javascript:'+this.ID+'.set_data('+ day_counter +');">'+ day_counter + '</a></td>';
		else if (is_hol == "Y")
		{ 
			if (is_exi=="N") calendar_html += '<td class="Calendar_holyday_empty_td '+brc+'">' + day_counter + '</td>';
			else if (is_exi=="Y") calendar_html += '<td class="Calendar_holyday_td '+brc+'"><a class="Calendar_holyday_a" href="javascript:'+this.ID+'.set_data('+ day_counter +');">' + day_counter + '</a></td>';
		}
		else
		{
			if (is_exi=="N") calendar_html += '<td class="Calendar_day_empty_td '+brc+'">' + day_counter + '</td>';
			else if (is_exi=="Y") calendar_html += '<td class="Calendar_day_td '+brc+'"><a class="Calendar_day_a" href="javascript:'+this.ID+'.set_data('+ day_counter +');">' + day_counter + '</a></td>';
		} 
		
		first_line++;
		cur_week_day++;
	}

	calendar_html += '</tr>';
	
	var cur_month = this.from[1]-1;
	var cur_year = this.from[0];
	var out_years_select = '';
	
	var months_count = 12*(this.to[0]-this.from[0])+(this.to[1]-this.from[1])+1;
	var month_year_array = new Array();
	if (months_count<121)
	{
		for (var i=0; i<months_count;i++)
		{
			cur_month++;
			if (cur_month>12)
			{
				cur_month = 1;
				cur_year++;
			}
			var sub_arr = new Array();
			
			sub_arr['month'] = cur_month;
			sub_arr['year'] = cur_year;
			month_year_array[i] = sub_arr;
			if (cur_year == this.selected[0]&&cur_month == this.selected[1]) var selected = 'selected';
			else var selected = '';
			out_years_select += '<option class="Calendar_month_year_option" '+selected+' value="'+i+'">'+cur_year+', '+months[cur_month-1]+'</option>';
		}
	}
	
	this.month_year_array = month_year_array;
	
	calendar_html += '<tr class="Calendar_month_year_tr"><td colspan="7" class="Calendar_month_year_td"><select name="'+pref+'month_year_select" class="Calendar_month_year_select" onchange="'+this.ID+'.changeyearmonth(this.value);">'+out_years_select+'</select><td></tr>';
	calendar_html += '</table>';

	var indiv = document.getElementById(inner_div);
	indiv.innerHTML = calendar_html;
	
}