var calendars = new Array();
var calendar_days = new Array();

function GetMonthes() {
	var ar = new Array()
	ar[0] = 'Январь';
	ar[1] = 'Февраль';
	ar[2] = 'Март';
	ar[3] = 'Апрель';
	ar[4] = 'Май';
	ar[5] = 'Июнь';
	ar[6] = 'Июль';
	ar[7] = 'Август';
	ar[8] = 'Сентябрь';
	ar[9] = 'Октябрь';
	ar[10] = 'Ноябрь';
	ar[11] = 'Декабрь';
	return ar;
}		

function AddZero(number) {
	if (number < 10) 
		return '0'+number;
	else 
		return number;
}

function GetTimestampFromFormInput(calendar_id) {
	return new Number(document.getElementById('calendar'+calendar_id).value);
}

function GetTempTimestamp(calendar_id) {
	return new Number(document.getElementById('calendar'+calendar_id+'_temp').value);
}

function SetTempTimestamp(calendar_id, timestamp) {
	document.getElementById('calendar'+calendar_id+'_temp').value = timestamp;
}

function GetDaysNumberOfMonth(year, month) {
	var date = new Date(year, month, 28);
	var timestamp = date.getTime();
	var cur_month = month;
	var cur_date = new Date(timestamp);
	var cur_day = 28;

	while (cur_month == month) {
		cur_day = cur_date.getDate();
		timestamp = timestamp+8640000;
		cur_date = new Date(timestamp);
		cur_month = cur_date.getMonth();
	}
	return cur_day;
}

function GetYearPeriod() {
	return new Array(2004, 2010);
}

function RemoveAllChildren(parent_id) {

	var parent = document.getElementById(parent_id);
	var children = parent.childNodes;
	while(children.length > 0) {
	         parent.removeChild(children.item(0));
	}
			
} 

function AppendToSelect(id, value, html, selected) {
	var option = document.createElement('OPTION');
	option.value = value;
	option.innerHTML = html;
	if (selected) {
		option.setAttribute('selected', 'selected');
	}
	document.getElementById(id).appendChild(option);
	document.getElementById(id).style.display='none';
	document.getElementById(id).style.display='inline';
}

function FillYearSelect(calendar_id, year_begin, year_end) {

	var year_period = GetYearPeriod();

	if (!year_begin) year_begin = year_period[0];
	if (!year_end) year_end = year_period[1];

	var dt_input = new Date(GetTempTimestamp(calendar_id));

	RemoveAllChildren('calendar'+calendar_id+'_year');

	if (dt_input.getFullYear() < year_begin) {			
		AppendToSelect('calendar'+calendar_id+'_year', dt_input.getFullYear(), dt_input.getFullYear(), true);
	}

	for (var year = year_begin; year <= year_end; year++) {
		if (year == dt_input.getFullYear()) {
			AppendToSelect('calendar'+calendar_id+'_year', year, year, true);
		} else {
			AppendToSelect('calendar'+calendar_id+'_year', year, year, false);
		}
	}
			
	if (dt_input.getFullYear() > year_end) {			
		AppendToSelect('calendar'+calendar_id+'_year', dt_input.getFullYear(), dt_input.getFullYear(), true);
	}
}

function FillMonthSelect(calendar_id) {

	var dt_input = new Date(GetTempTimestamp(calendar_id));

	RemoveAllChildren('calendar'+calendar_id+'_month');

	monthes = GetMonthes();

	for (var month = 0; month < 12; month++) {
		if (month == dt_input.getMonth())
			AppendToSelect('calendar'+calendar_id+'_month', month, monthes[month], true);
		else
			AppendToSelect('calendar'+calendar_id+'_month', month, monthes[month], false);
	}
}

function OnDayClick(calendar_id, el) {

	var s_date = AddZero(GetYear(calendar_id))+'-'+AddZero(GetMonth(calendar_id)+1)+'-'+AddZero(el.innerHTML);
	window.location = document.getElementById('calendar'+calendar_id+'_url_prefix').value+s_date+'/';
}

function OnMonthChange(calendar_id, el) {

	GetFilledDays();
	var dt = new Date(GetYear(calendar_id), GetMonth(calendar_id), 1, 0, 0);
	SetTempTimestamp(calendar_id, dt.getTime());
}


function OnYearChange(calendar_id, el) {

	var dt = new Date(GetYear(calendar_id), GetMonth(calendar_id), 1, 0, 0);
	SetTempTimestamp(calendar_id, dt.getTime());
	FillMonthSelect(calendar_id);
	GetFilledDays();
}

function eventOnDayClick() {
	el = event.srcElement;
	while (el.className != 'calendar') {
		el = el.parentElement;
	}

	OnDayClick(el.getAttribute('calendar_id'), event.srcElement);
}

function IsDayFilled(day) {

	for (var i=0; i < calendar_days.length; i++) {
		if (calendar_days[i] == day) return true;
	}
	return false;
}

function AppendToRow(calendar_id, row, number, class_name) {

	var td = document.createElement('TD');
	td.innerHTML = number;
	if (class_name) td.className = class_name;
	if (! IsDayFilled(number) && class_name != 'current' && class_name != 'active') {
		td.className = 'none';
	} else {
		if (navigator.appName == "Microsoft Internet Explorer") {
			td.attachEvent('onclick', eventOnDayClick);
		} else {
			td.setAttribute('onclick', 'OnDayClick("'+calendar_id+'",this)');			
		}
	}
	row.appendChild(td);
}


function FillDayTable(calendar_id) {

	var dt_input = new Date(GetTempTimestamp(calendar_id));
	var dt_form_input = new Date(GetTimestampFromFormInput(calendar_id));
	var dt_first_day_of_month = new Date(dt_input.getFullYear(), dt_input.getMonth(), 1);
	var dt_current = new Date();
	
	RemoveAllChildren('calendar'+calendar_id+'_days');

	days_number = GetDaysNumberOfMonth(dt_input.getYear(), dt_input.getMonth());

	var day_table = new Array();
	
	var week_day_of_first_day = dt_first_day_of_month.getDay();
	if (week_day_of_first_day == 0) week_day_of_first_day = 7;
	week_day_of_first_day = week_day_of_first_day - 1;

        var week_day = 0;
	var day = 1;
	var row = document.createElement('TR');

	while (week_day < week_day_of_first_day) {
		AppendToRow(calendar_id, row, '', 'none');
		week_day++;
	}			

	while (day <= days_number) {
		if (week_day > 6) {
			document.getElementById('calendar'+calendar_id+'_days').appendChild(row);
			row = document.createElement('TR');
			week_day = 0;
		}

		var class_name = false;
		

		if ( day == dt_current.getDate() &&
		dt_input.getMonth() == dt_current.getMonth() &&
			dt_input.getFullYear() == dt_current.getFullYear()) {
			class_name = 'current';
			}

		if ( day == dt_form_input.getDate() &&
			dt_input.getMonth() == dt_form_input.getMonth() &&
			dt_input.getFullYear() == dt_form_input.getFullYear()) class_name = 'active';

		
		AppendToRow(calendar_id, row, day, class_name);
		week_day++;
		day++;
	}			
	while (week_day < 7) {
        	AppendToRow(calendar_id, row, '', 'none');
		week_day++;
	}			

	document.getElementById('calendar'+calendar_id+'_days').appendChild(row);
}

var calendar_req = false;

function GetText() {}

function OnLoadedDays() {
	if (calendar_req.readyState == 4) {

		var text = calendar_req.responseText;

		calendar_days = text.split(' ');

		FillDayTable('_ajax');
		HideLoadingDays('_ajax');
	} else {
	    // still not ready
	}
}

function ShowLoadingDays(calendar_id) {
	document.getElementById('calendar'+calendar_id+'_loading').style.display = 'block';
}
function HideLoadingDays(calendar_id) {
	document.getElementById('calendar'+calendar_id+'_loading').style.display = 'none';
}


function GetFilledDays() {

	calendar_days = new Array();
	
	ShowLoadingDays('_ajax');

        // Mozilla/Safari
        if (window.XMLHttpRequest) {
                calendar_req = new XMLHttpRequest();
//                calendar_req.overrideMimeType('text/xml');
        }
        // IE
        else if (window.ActiveXObject) {
               calendar_req = new ActiveXObject("Microsoft.XMLHTTP");
        }

	calendar_req.onreadystatechange = OnLoadedDays;

	days_xml_name = document.getElementById('calendar_ajax_days_url_prefix').value+GetYear('_ajax')+'-'+(GetMonth('_ajax')+1)+'.txt';


	calendar_req.open('GET', days_xml_name, true);
	calendar_req.send(null);
}


function GetDay(calendar_id) {
	days = document.getElementById('calendar'+calendar_id+'_days').getElementsByTagName('TD');
	for (var i=0; i<days.length; i++) {
		if (days.item(i).className == 'active') return new Number(days.item(i).innerHTML)
	}
}
	
function GetMonth(calendar_id) {
	monthes = document.getElementById('calendar'+calendar_id+'_month').childNodes;
	for (var i=0; i<monthes.length; i++) {
		if (monthes.item(i).selected == true) return new Number(monthes.item(i).value)
	}
}

function GetYear(calendar_id) {
	years = document.getElementById('calendar'+calendar_id+'_year').childNodes;
	for (var i=0; i<years.length; i++) {
		if (years.item(i).selected == true) return new Number(years.item(i).value)
	}
}

function ShowCalendar(calendar_id) {
	SetTempTimestamp(calendar_id, GetTimestampFromFormInput(calendar_id))
	UpdateCalendar(calendar_id);
	document.getElementById('calendar'+calendar_id+'_body').style.display = 'block';
	calendars[calendar_id] = true;
}

function UpdateCalendar(calendar_id) {
	FillYearSelect(calendar_id);
	FillMonthSelect(calendar_id);
	GetFilledDays();
	FillDayTable(calendar_id);
}

function IsAjaxHere() {
	var test = null;
	
	if (navigator.userAgent.indexOf('MSIE 5.0')!=(-1)) {
		return false;
	} 

	if (window.XMLHttpRequest) {
		try {
			test = new XMLHttpRequest();
	        } catch(e) {
			test = false;
	        }
	} else 	if (window.ActiveXObject) {
		try {
			test = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
			test = false;
	        }
	}


	if (test) {
	
		return true;
	} else {
		return false;
	}
}