var mnth = new Array("ßíâàðü", "Ôåâðàëü", "Ìàðò", "Àïðåëü", "Ìàé", "Èþíü", "Èþëü", "Àâãóñò", "Ñåíòÿáðü", "Îêòÿáðü", "Íîÿáðü", "Äåêàáðü");
var mnts = new Array("ßÍÂÀÐß", "ÔÅÂÐÀËß", "ÌÀÐÒÀ", "ÀÏÐÅËß", "ÌÀß", "ÈÞÍß", "ÈÞËß", "ÀÂÃÓÑÒÀ", "ÑÅÍÒßÁÐß", "ÎÊÒßÁÐß", "ÍÎßÁÐß", "ÄÅÊÀÁÐß");
var WeekTitles = new Array('Ïí', 'Âò', 'Ñð', '×ò', 'Ïò', 'Ñá', 'Âñ');


function checkExist(type, d, m, y) {
    if (typeof existingDates == "undefined"
        || existingDates.length == 0)
        return false;
    if(
            (type == 1
                && (!existingDates[y*1 - 1990] || !existingDates[y*1 - 1990][m*1 - 1] || jQuery.inArray(d*1, existingDates[y*1 - 1990][m*1 - 1]) < 0)
            )
            ||
            (type == 2
                && (!existingDates[y*1 - 1990] || !existingDates[y*1 - 1990][m*1 - 1])
            )
            ||
            (type == 3
                && (!existingDates[y*1 - 1990])
            )
    )
       return false;
    return true;
}

function findClosestExistingDate(type, d, m, y) {
    var dn = d;
    var mn = m;
    var yn = y;
    if (typeof existingDates != "undefined" && existingDates.length>0) {
        if (type == 1) {
            for (var i = d + 1; i <= dayonmonth(m, y); i++) {
                if (jQuery.inArray(i * 1, existingDates[y * 1 - 1990][m * 1 - 1]) >= 0) {
                    dn = i;
                    break;
                }
            }
            if (dn == d) {
                for (var i = d - 1; i >= 1; i--) {
                    if (jQuery.inArray(i * 1, existingDates[y * 1 - 1990][m * 1 - 1]) >= 0) {
                        dn = i;
                        break;
                    }
                }
            }
        } else if (type == 2) {
            for (var i = m + 1; i < 12; i++) {
                if (existingDates[y - 1990][i - 1]) {
                    mn = i + 1;
                    break;
                }
            }
            if (mn == m) {
                for (var i = m - 1; i >= 0; i--) {
                    if (existingDates[y - 1990][i - 1]) {
                        mn = i + 1;
                        break;
                    }
                }
            }
        } else if (type == 3) {
            for (var i = y - 1; y > 0; i--) {
                if (existingDates[i - 1990]) {
                    yn = i;
                    break;
                }
            }
        }
    }
    return new Date(mn + '/' + dn + '/' + yn);
}

function chg() {
    var dN = $('#d' + $('#arc-d').text()); dN.find('div').attr('class', 'selected');
    var mN = $('#m' + $('#arc-m').text()); mN.find('div').attr('class', 'selected');
    var yN = $('#y' + $('#arc-y').text()); yN.find('div').attr('class', 'selected');
}
function calendar_show(d, m, y) {
    d = d * 1;
    m = m * 1;
    y = y * 1;
    if (d && m && y) {
        var mdate = new Date(m + '/' + d + '/' + y);
        var dw = mdate.getDate();
        var mw = mdate.getMonth() + 1;
        var yw = mdate.getFullYear();
        if (dw != d) {
            var mm = (mw > 1) ? --mw : 1;
            var yy = (mw > 1) ? yw : --yw;
            var days = dayonmonth(mm, yy);
            /*if (dw > 1) {
            dw--;
            } else {*/
            dw = eval(days);
            mw = eval(mm);
            yw = eval(yy);
            //}
            calendar_show(dw, mw, yw);
        } else {
            if (!checkExist(3, d, m, y) && existingDates.length > 0) {
                y = findClosestExistingDate(3, d, m, y).getFullYear();
                calendar_show(d, m, y);
               // return;
            }
            if (!checkExist(2, d, m, y) && existingDates.length > 0) {
                m = findClosestExistingDate(2, d, m, y).getMonth();
                calendar_show(d, m, y);
                //return;
            }
            if (!checkExist(1, d, m, y) && existingDates.length > 0) {
                d = findClosestExistingDate(1, d, m, y).getDate();
                calendar_show(d, m, y);
               // return;
            }
            var sdate = new Date(m + '/1/' + y);
            var todaydate = new Date();
            var days = dayonmonth(m, y);
            var mon = todaydate.getMonth() + 1;
            var yea = todaydate.getFullYear();
            var iday = 0, mday = 0, yday = 0, day = 0, answer = '';
            $('#arc-d').text(d);
            $('#arc-m').text(m);
            $('#arc-y').text(y);
            $('#arc-x').text(mnts[m - 1]);
            answer += '<ul><li class="day"><table class="archive_title">';
            answer += showallweektitles();
            answer += '</table><table class="archive_main"><tr>';
            var sd = sdate.getDay() - 1 < 0 ? 7 : sdate.getDay();
            var prevdays = dayonmonth(sdate.getMonth(), sdate.getYear() + 1);
            for (day = 0; day < sd - 1; day++) {
                iday++;
                var mp = eval(m) - 1, yp = eval(y), dp = eval((eval(prevdays - sdate.getDay() + 2)) + eval(day));
                if (mn == 0) { mp = 12; yp = eval(y) - 1; };
                answer += "<td class=\"droparchive\"><div>&nbsp;</div></td>";  //onClick=\"calendar_show("+dp+","+mp+","+yp+");\" //<div>"+dp+"</div>
            }
            for (day = 1; day <= days; day++) {
                iday++;
                if (!checkExist(1, day, m, y) || ((todaydate.getMonth() + 1) == m && todaydate.getDate() < day && todaydate.getFullYear() == y))
                    answer += "<td class=\"droparchive\"><div>" + day + "</div></td>";
                else
                    answer += "<td class=\"jsdroparchive\" id=\"d" + day + "\" onClick=\"calendar_show(" + day + "," + m + "," + y + ");\"><div>" + day + "</div></td>";
                if (iday == 7) {
                    answer += "</tr><tr>";
                    iday = 0;
                }
                if (day == days && iday != 0) {
                    var nextdays = 7 - eval(iday);
                    var mn = eval(m) + 1, yn = eval(y);
                    if (mn == 13) { mn = 1; yn = eval(y) + 1; };
                    for (nday = 1; nday <= nextdays; nday++) {
                        answer += "<td class=\"droparchive\"><div>&nbsp;</div></td>";  //onClick=\"calendar_show("+nday+","+mn+","+yn+");\" //<div>"+nday+"</div>
                    }
                }
            }
            answer += "</tr></table></li>";
            answer += '<li class="month"><table class="archive_title"><tbody><tr><td>&nbsp;</td></tr></tbody></table>';
            answer += '<table class="archive_main"><tbody><tr>';
            for (mm = 1; mm <= 12; mm++) {
                mday++;
                if (!checkExist(2, d, mm, y) || (mon < mm && yea == y))
                    answer += '<td class="droparchive" id="m' + mm + '"><div>' + mnth[mm - 1] + '</div></td>';
                else
                    answer += '<td class="jsdroparchive" id="m' + mm + '" onClick="calendar_show(' + d + ',' + mm + ',' + y + ')"><div>' + mnth[mm - 1] + '</div></td>';
                if (mday == 3) {
                    answer += '</tr><tr>';
                    mday = 0;
                }
            }
            answer += '</tr></tbody></table></li>';
            answer += '<li class="year"><table class="archive_title"><tbody><tr><td>&nbsp;</td></tr></tbody></table>';
            answer += '<table class="archive_main"><tbody><tr>';
            for (yy = 1990; yy <= 2014; yy++) {
                yday++
                if (yy == 1990)
                    answer += '<td class="droparchive"><div>' + yy + '</div></td>';
                else if (!checkExist(3, d, m, yy) || (yy > yea))
                    answer += '<td class="droparchive"><div>' + yy + '</div></td>';
                else
                    answer += '<td class="jsdroparchive" id="y' + yy + '" onClick="calendar_show(' + d + ',' + m + ',' + yy + ');"><div>' + yy + '</div></td>';
                if (yday == 5) {
                    answer += '</tr><tr>';
                    yday = 0;
                }
            }
            answer += '</tr></tbody></table></li></ul>';
            if (dw == d) {
                document.getElementById('calendar').innerHTML = answer;
                chg();
                rty();
            }
        }
    }
}
function showallweektitles() {
    var i, answer = "<tr>\n";
    for (i = 0; i < WeekTitles.length; i++)
        answer += "<td>" + WeekTitles[i] + "</td>\n";
    answer += "</tr>\n";
    return answer;
}
function dayonmonth(m, y) {
    var answer;
    m = eval(m);
    y = eval(y);
    if (m != 2) { // Åñëè íå "Ôåâðàëü"
        var date1 = new Date(m + '/31/' + y);
        var mm = (m < 12) ? (m + 1) : 1;
        var yy = (m < 12) ? y : (y + 1);
        var date2 = new Date(mm + '/1/' + yy);
        answer = (date1.getDay() == date2.getDay()) ? '30' : '31';
    } else {
        var date1 = new Date(m + '/29/' + y);
        var mm = (m < 12) ? (m + 1) : 1;
        var yy = (m < 12) ? y : (y + 1);
        var date2 = new Date(mm + '/1/' + yy);
        answer = (date1.getDay() == date2.getDay()) ? '28' : '29';
    }
    return answer;
}
function rty() {
    $('#calendar').each(function () {
        objj = $(this);
        var s = $('li', objj).length;
        var w = objj.width();
        var h = objj.height();
        $('ul', objj).css('width', s * w);
        $('li', objj).css('float', 'left');

        var rsel = $('table.cal_head td div').index($('div.samoeact'));
        if (rsel != 0) {
            f = (rsel * w * -1);
            $('ul', objj).stop().css('margin-left', f);
        }

        $('table.cal_head td.act').click(function () {
            var cN = $('table.cal_head td').index($(this));
            $('table.cal_head div.samoeact').toggleClass('samoeact').toggleClass('samoetop');
            $(this).find('div').toggleClass('samoetop').toggleClass('samoeact');
            animate(cN);
        });

        function animate(t) {
            p = (t * w * -1);
            $('ul', objj).stop().animate({ marginLeft: p }, 'fast');
        };
    });
}
