Я бы рекомендовал вместо 2х массивов monthdays, и monthnames
писать
month=[{name:"Января", monthdays:31},{name:"Февраля",monthdays:31},и тд ]
так будет по понятнее.
Что касается дней недели.
Этот алгоритм корректно работает с датами, позже 1583 года.
Ибо новый стиль был впервые введён только в 1582.
function getDay(day,mon,year){
var days = new Array("воскресенье","понедельник","вторник","среда","четверг","пятница","суббота");
day=parseInt(day); //если день двухсимвольный и <10
mon=parseInt(mon); //если месяц двухсимвольный и <10
var a=parseInt((14-mon)/12);
var y=year-a;
var m=mon+12*a-2;
var d=(7000+parseInt(day+y+parseInt(y/4)-parseInt(y/100)+parseInt(y/400)+(31*m)/12))%7;
return days[d];
}