
def IsLeapYear(y):
    if y % 400 == 0:
        return True
    elif y % 100 == 0:
        return False
    elif y % 4 == 0:
        return True
    else:
        return False

def DayName(d):
    if d == 0:
        return "Sunday"
    elif d == 1:
        return "Monday"
    elif d == 2:
        return "Tuesday"
    elif d == 3:
        return "Wedneday"
    elif d == 4:
        return "Thursday"
    elif d == 5:
        return "Friday"
    elif d == 6:
        return "Saturday"
    else:
        return "No such day"

def MonthName(m):
    if m == 1:
        return "January"
    elif m == 2:
        return "February"
    elif m == 3:
        return "March"
    elif m == 4:
        return "April"
    elif m == 5:
        return "May"
    elif m == 6:
        return "June"
    elif m == 7:
        return "July"
    elif m == 8:
        return "August"
    elif m == 9:
        return "September"
    elif m == 10:
        return "October"
    elif m == 11:
        return "November"
    elif m == 12:
        return "December"
    else:
        return "I don't know that month"

def DaysInMonth(month, year):
    # This returns the number of days in the given month
    if month == 1:
        return 31
    elif month == 2:
        if IsLeapYear(year):
            return 29
        else:
            return 28
    elif month == 3:
        return 31
    elif month == 4:
        return 30
    elif month == 5:
        return 31
    elif month == 6:
        return 30
    elif month == 7:
        return 31
    elif month == 8:
        return 31
    elif month == 9:
        return 30
    elif month == 10:
        return 31
    elif month == 11:
        return 30
    elif month == 12:
        return 31
    else:
        print "Bad month"
        return 0
        
def CountDays(month, day, year):
    # This returns the number of days between 1/1/1800 and month/day/year
    total = 0
    for y in range(1800, year):
        if IsLeapYear(y):
            total = total + 366
        else:
            total = total + 365
    for m in range(1, month):
        total = total + DaysInMonth(m, year)
    total = total + day - 1
    return total

def DayOfWeek(month, day, year):
    # This returns 0 if month/day/year is a Sunday, 1 if it is a Month, etc.
    dayCount = CountDays(month, day, year)
    d = dayCount % 7
    if d == 0:
        return 3
    elif d == 1:
        return 4
    elif d == 2:
        return 5
    elif d == 3:
        return 6
    elif d == 4:
        return 0
    elif d == 5:
        return 1
    elif d == 6:
        return 2

def PrintDay(month, day, year, Notes):
    d = DayOfWeek(month, day, year)
    print "That was a %s" % DayName(d)
    if (month, day, year) in Notes.keys():
        print Notes[(month, day, year)]
    string = raw_input( "New note for this day? " )
    if string != "":
        if (month, day, year) in Notes.keys():
            Notes[(month, day, year)].append(string)
        else:
            Notes[(month, day, year)] = [string]


def PrintMonthCal(startDay, daysIn):
    for day in ['S', 'M', 'T', 'W', 'Th', 'F', 'S']:
        print "%5s" % day,
    print
    counter = startDay
    for b in range(0, startDay):
        print "%5s" % "",
    for day in range(1, 1+daysIn):
        print "%5d" % day,
        counter += 1
        if counter == 7:
            counter = 0
            print
    print

def tab(n):
    # This prints n blank spaces
    t = ""
    for i in range(0, n):
        t = t + " "
    print t,
    
def PrintMonth(month, year):
    name = MonthName(month)
    spaces = 4 + (35-len(name))/2
    print " "*  spaces,
    print "%s" % name
    PrintMonthCal( DayOfWeek(month, 1, year), DaysInMonth(month, year) )
    
def PrintYear(year):
    for m in range(1, 13):
        PrintMonth(m, year)
        
def main():
    done = False
    Notes = {}
    while not done:
        string = raw_input("Enter date in the form m d y,  or a blank to exit: ")
        nums = string.split()
        if len(nums) == 0:
            done = True
        elif len(nums) == 1:
              year = int(nums[0])
              PrintYear(year)
        elif len(nums) == 2:
              month = int(nums[0])
              year = int(nums[1])
              PrintMonth(month, year)
        else:
            month = int(nums[0])
            day = int(nums[1])
            year = int(nums[2])
            PrintDay(month, day, year, Notes)
main()
