function str_replace(search, replace, subject) {
	return subject.split(search).join(replace);
}
function get_months_days(year, month) {
	months_days = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	if (month % 12 != 1) return months_days[month % 12];
	n = 28;
	if (!(year % 4)) n = 29;
	if (!(year % 100)) n = 28;
	if (!(year % 400)) n = 29;
	return n;
}
function show_cal(year, month, tpl, actives, lang) {
	date = new Date();
	if (!month) month = date.getDate();
	cur_month = date.getMonth() + 1; if (!month) month = cur_month;
	cur_year = date.getYear(); if (!year) year = cur_year;
	delete date;

	if (lang == 'en')
		months_RU = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
	else
		months_RU = new Array('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');

	ret = tpl['header'];
	ret += str_replace('{year}', year, tpl['year']);
	ret += tpl['year_footer'];

	cnt = 0;
	for (i = 1; i < 13; i++) {
		if (actives[Array(year, i)]) {
			if (cnt == 2) {
					ret += tpl['separator'];
					cnt = 0;
			}

			str = 'month';
			mdays = get_months_days(year, i - 1);
			if (cur_year == year && cur_month == i) str += '_cur';
			if (month == i) str += '_active';
			ret += str_replace('{year}', year, str_replace('{month}', i, str_replace('{month_name}', months_RU[i - 1], str_replace('{day}', mdays, tpl[str]))));

			cnt++;
		}
	}

	ret += tpl['footer'];
	return ret;
}
