There is a utility that is common to unix-based systems called 'cal'. It is able to output the calendar for any year or any month of any year from the year 1 up to the year 9999.

The 'cal' program is an extremely capable tool, it even handles unusual years, like 1752 (when the calendar was switched over from the Julian calendar to the Gregorian calendar. (Note that September jumps from the 2nd to the 14th).

Here is the source code to what is essentially a clone (behavior-wise) of the 'cal' utility. I have written the program in C++ (the original program was written in C) and I've worked to make my implementation as clear, simple and straightforward as possible.

The source should be very portable, I have compiled it using both MicroSoft's C++ compiler as well as the GNU G++ compiler without any trouble.

calendar.cpp

And here is the source code to a javascript calendar that is easily embedded into a web page.

cal.js  
Using the javascript calendar is easy:
  1. In your html page, "source in" the cal.js file:
    <script src="cal.js"></script>
  2. Create a 'div' with an id of your choosing:
    <div id="the_div"></div>
  3. Invoke the 'doCalendar' function to activate the calendar:
    <script>doCalendar("the_div");</script>

 
                               1752                                

       January               February                 March        
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 
          1  2  3  4                      1    1  2  3  4  5  6  7
 5  6  7  8  9 10 11    2  3  4  5  6  7  8    8  9 10 11 12 13 14
12 13 14 15 16 17 18    9 10 11 12 13 14 15   15 16 17 18 19 20 21
19 20 21 22 23 24 25   16 17 18 19 20 21 22   22 23 24 25 26 27 28
26 27 28 29 30 31      23 24 25 26 27 28 29   29 30 31

        April                   May                   June         
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 
          1  2  3  4                   1  2       1  2  3  4  5  6
 5  6  7  8  9 10 11    3  4  5  6  7  8  9    7  8  9 10 11 12 13
12 13 14 15 16 17 18   10 11 12 13 14 15 16   14 15 16 17 18 19 20
19 20 21 22 23 24 25   17 18 19 20 21 22 23   21 22 23 24 25 26 27
26 27 28 29 30         24 25 26 27 28 29 30   28 29 30
                       31
        July                  August                September      
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 
          1  2  3  4                      1          1  2 14 15 16
 5  6  7  8  9 10 11    2  3  4  5  6  7  8   17 18 19 20 21 22 23
12 13 14 15 16 17 18    9 10 11 12 13 14 15   24 25 26 27 28 29 30
19 20 21 22 23 24 25   16 17 18 19 20 21 22
26 27 28 29 30 31      23 24 25 26 27 28 29
                       30 31
       October               November               December       
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa 
 1  2  3  4  5  6  7             1  2  3  4                   1  2
 8  9 10 11 12 13 14    5  6  7  8  9 10 11    3  4  5  6  7  8  9
15 16 17 18 19 20 21   12 13 14 15 16 17 18   10 11 12 13 14 15 16
22 23 24 25 26 27 28   19 20 21 22 23 24 25   17 18 19 20 21 22 23
29 30 31               26 27 28 29 30         24 25 26 27 28 29 30
                                              31