var traversal = typeof document.
                            createElement('div').
                                            childElementCount != 'undefined';
var children = typeof document.
                          createElement('div').
                              children != 'undefined';
                                                                          
var firstChild = traversal ? function(node) {
    return node.firstElementChild;
} : function(node) {
    node = node.firstChild;
    while(node && node.nodeType != 1) node = node.nextSibling;
    return node;
};

var child = children ? function(node) {
    return node.children;
} : function(node) {
    var list = node.childNodes,
    length = list.length,
    i = -1,
    array = [];
    while(++i < length)
        if(list[i].nodeType == 1)
            array.push(list[i]);
    return array;
};                                            

// расширяем функционал объекта Date :)
Date.prototype.lastday = function() {
  var d = new Date(this.getFullYear(), this.getMonth() + 1, 0);
  return d.getDate();
};

function initCalendar(el, link_prefix, link_postfix)
{
	//link_prefix = /news/?date=
	var d = new Date();
	var cyear = parseInt(d.getFullYear());
	var cmonth = parseInt(d.getMonth());
	var cday = parseInt(d.getDate());

	function href(y, m, d)
	{
		if(y > cyear || (y == cyear && m > cmonth) || (y == cyear && m == cmonth && d > cday))
			return d;
		return '<a href="'+ link_prefix + y +'-'+ addZero(m+1) +'-'+ addZero(d) + link_postfix +'">'+ d +'</a>';
	}

    var calendar = ge(el);
	var maxy = 2015;//parseInt(d.getFullYear())


    var firstLaunch = (calendar.innerHTML == '');
    if(firstLaunch)
	{
		var year = cyear;
		var month = cmonth;

        var selectorF = ce('FORM', calendar, {onsubmit: function () {return false;}});

        var yearSelect = ce('select', selectorF);
		for(var y=2009; y<=maxy; y++)
		{
			ce('OPTION', yearSelect, {value: y, innerHTML: y});
		}
		yearSelect.options[year-2009].selected = true;
	
        var monthes = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
		var monthSelect = ce('SELECT', selectorF);
        for (var m=0; m<monthes.length; m++)
		{
			ce('OPTION', monthSelect, {value: m, innerHTML: monthes[m]});
        }
		monthSelect.options[month].selected = true;
   
        monthSelect.onchange = function(){initCalendar(el, link_prefix, link_postfix)};
		yearSelect.onchange = function(){initCalendar(el, link_prefix, link_postfix)};
    }
	else
	{
        var yearSelect = calendar.firstChild.firstChild;
        var monthSelect = yearSelect.nextSibling;

		var year = parseInt(yearSelect.options[yearSelect.selectedIndex].value);
		var month = parseInt(monthSelect.options[monthSelect.selectedIndex].value);

        de(calendar.childNodes[1]);
    }
	var calendarTable = ce('TABLE', calendar);
    var weekdays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"];
	var tbody = ce('TBODY', calendarTable);
    for(var row=1; row<=7; row++)
	{
        var tr = ce('TR', tbody);
        for(var cell=1; cell<=7; cell++)
		{
            var td = ce((row==1 ? 'TH':'TD'), tr);
            if(cell == 6 || cell == 7)
				td.className = 'holid';
            if(row==1)
				td.innerHTML = weekdays[cell-1];
        }
    }

    var firstDay = new Date(year, month, 1);
    var firstDayWeekDay = firstDay.getDay();
    var monthDays = firstDay.lastday();
    var firstRowCells = calendarTable.rows[1].childNodes;
    var firstDayTd =  (firstDayWeekDay != 0) ? firstRowCells[firstDayWeekDay-1] : firstRowCells[6];
    firstDayTd.innerHTML = href(year,  month, 1);
    if(firstDayWeekDay == 0 || firstDayWeekDay == 6)
		firstDayTd.className = 'holid';

    var day = 2;
    if(firstDayWeekDay != 0)
	{
        for(var i = firstDayWeekDay; i<=(firstRowCells.length-1); i++)
		{
            firstRowCells[i].innerHTML = href(year, month, day);
            if(i==5 || i==6)
				firstRowCells[i].className = 'holid';
            day++;        
        }
    }
    for(var i=2; i<calendarTable.rows.length; i++)
	{
        var cells = calendarTable.rows[i].childNodes;
		var t = day;
        for(var c=0; c<cells.length && day<=monthDays; c++)
		{
            cells[c].innerHTML = href(year, month, day);
            if(c==5 || c==6)
				cells[c].className = 'holid';
            day++;    
        }
    }
	if(calendarTable.rows[calendarTable.rows.length-1].firstChild.innerHTML == '')
		de(calendarTable.rows[calendarTable.rows.length-1]);
}