	var parent_object = ''; //тот, кто вызвал календарь
    var month = 0;
    var year = 0;
    var yearFrom = 0;
    var yearTo = 0;
    var m = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
    var strDate = 0;
    var block = false;

    var parent = new Object();

	function getFirstDay (){

    	var firstDate = new Date (year, month, 1);
        var d = firstDate.getDay();
    	if (d == 0)
    		d = 7;

        return 1 - (d - 1);

	}

	function getMonthLen () {
        var nextMonth = new Date(year, Math.round(month) + Math.round(1), 1); // special for Opera :((
    	nextMonth.setHours(nextMonth.getHours( ) - 3);

	   	return nextMonth.getDate();

	}


	function calendar_js () {

        var date = getFirstDay (year, month);
        var last = getMonthLen (year, month);

        var calendar = new Array();
        while ( date <= last ) {

            var i = 0;
            var week = new Array();
            for ( i = 0; i < 7; i++, date++ )
            	week[i] = ( 0 < date && date <= last) ? date : "";

            calendar[calendar.length] = week;

        }

        return calendar;

    }

    function write_form () {

        var str = '';//'<form name="selDate">';
        str += '<select name="selMonth" onchange="updateCalendar(year, this.value)" class="calSel">';

		for (var i = 0; i < 12; i++)
            str += '<option value="' + i + '" '+ ( i == month ? 'selected' : '') +'>' + m[i];

        str += '</select>&nbsp;&nbsp;&nbsp;';

        str += '<select name="selYear" onchange="updateCalendar(this.value, month)" class="calSel">';

        for (i = yearFrom; i <= yearTo; i++)
        	str += '<option value="'+ i +'" '+ (i == year ? 'selected' : '') +' >' + i + '</option>';

        str += '</select></form>';

        return str;

    }

    function setDate (day) {
        var myMonth = Math.round(month) + Math.round(1);
        strDate = day + '.' + (myMonth > 9 ? myMonth : '0' + myMonth) + '.' + year;

    }

    function write_calendar () {

        var cal = new Array();
    	cal = calendar_js ( year, month );

        var str = '<table border="1" class="calTable"><tr>';
        str += '<th>ПН</th><th>ВТ</th><th>СР</th><th>ЧТ</th><th>ПТ</th><th>СБ</th><th>ВС</th>';
		for (var i = 0; i < cal.length; i++) {

			str += '<tr>';

			for (var j = 0; j < cal[i].length; j++)
                str += '<td>'+ (cal[i][j] ? '<a href="#1" class="calendarText" onclick="setDate('+ cal[i][j] +'), setParentValue();">' + cal[i][j] + '</a>' : '&nbsp;') +'</td>';

            str += '</tr>';

        }
        str += '</table>';
        str += write_form();

        return str;

    }

    function initCalendar (minYear) {

        var d = new Date();
		year = d.getFullYear();
        month = d.getMonth();

        if (minYear) {
			yearFrom = minYear;
			yearTo = year;
		} else {
            yearFrom = year;
			yearTo = Math.round(year) + Math.round(1);
        }


		setDate (d.getDate());

        document.getElementById('calendar1').innerHTML = '';
        document.getElementById('calendar1').innerHTML = write_calendar ();

    }

    function updateCalendar (newYear, newMonth) {

        year = newYear;
        month = newMonth;

        var d = new Date();
        setDate (d.getDate());

        document.getElementById('calendar1').innerHTML = '';
        document.getElementById('calendar1').innerHTML = write_calendar ();

    }


function setParentValue () {

    parent.value = strDate;
// специально для Оперы ///////////////////////////////////////////
	if(parent == window)
	{
		document.getElementById(this.parent_object).value = strDate;
		p = document.getElementById(this.parent_object);
	}else
	{
		var p = parent;
	}
/////////////////////////////////////////////////////////////////
    
    hideCalendar();
	var d = document.getElementById("startDate");
    if (p == d) {
		checkDate ( d );
	}
    d = document.getElementById("endDate");
    if (p == d) {
	    checkDate ( d );
	}	
}

function hideCalendar () {

	var cal = document.getElementById("calendar");

    parent = null;
    block = false;
    cal.style.cssText = 'visibility: hidden';
	var foo = cal.innerHTML;					// ненавижу осла
	cal.innerHTML = '';
	cal.innerHTML = foo;

}

function check_and_hideCalendar (evt) {

    if (block == false)
		hideCalendar();

}


function blockEvents() {
	block = true;
}

function unblockEvents() {
	block = false;
}

    // read position of an element in regular document flow
function getElementPosition(elemID) {
    var offsetTrail = document.getElementById(elemID);
    var offsetLeft = 0;
    var offsetTop = 0;
    while (offsetTrail) {
        offsetLeft += offsetTrail.offsetLeft;
        offsetTop += offsetTrail.offsetTop;
        offsetTrail = offsetTrail.offsetParent;
    }
    if (navigator.userAgent.indexOf("Mac") != -1 &&
        typeof document.body.leftMargin != "undefined") {
        offsetLeft += document.body.leftMargin;
        offsetTop += document.body.topMargin;
    }
    return {left:offsetLeft, top:offsetTop};
}

// position and show calendar
function showCalendar(evt, objParent, minYear) {
    evt = (evt) ? evt : event;
    var cal = document.getElementById("calendar");
    var elem = (evt.target) ? evt.target : evt.srcElement;
    var p = (objParent ? objParent : elem);
	this.parent_object = p.name;
    if (evt) {
		if (parent != p) {
        	hideCalendar(cal);
        }

        if (cal.style.visibility != "visible") {
            var position = getElementPosition(elem.id);
            parent = p;

            initCalendar(minYear);
            var result = isRightDate(parent.value);
			if (result)
				updateCalendar(result[3], (result[2]-1)); 

            var left = Math.round(position.left) + Math.round(elem.offsetWidth);
            var cssText = 'left: ' + left + ';';
            cssText += 'top: ' + position.top + ';';
            cssText += 'visibility: visible';
            cal.style.cssText = cssText;

        } else {
			hideCalendar();
        }
    }
}

