How do I fix this calendar javascript code?
<p>Can anyone help me fix the following javascript code?</p>

<p>It is supposed to produce a calendar, but the first line is not right.</p>

<p>Two problems that I can see:</p>

<ol>
<li>The 1st of april is not on a sunday, so it starts on the wrong day</li>
<li>The line is too long, unless April of 2009 really has a first week containing 18 days</li>
</ol>

<p>I'd appreciate any help you can give me.</p>

<p>Here's a screenshot showing the problem for April 2009 (which starts on Wednesday btw).</p>

<p><img src="http://img220.imageshack.us/img220/551/calendarr.jpg" alt="calendar">?</p>

<p>And here's the faulty javascript code.</p>

<pre><code>&lt;SCRIPT LANGUAGE="JavaScript"&gt; 
monthnames = new Array("January", "Februrary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var linkcount = 0;
function addlink(month, day, href)

{
    var entry = new Array(3);
    entry[0] = month;
    entry[1] = day;
    entry[2] = href;
    this[linkcount++] = entry;
}
Array.prototype.addlink = addlink;
linkdays = new Array();
monthdays = new Array(12);
monthdays[0] = 31;
monthdays[1] = 28;
monthdays[2] = 31;
monthdays[3] = 30;
monthdays[4] = 31;
monthdays[5] = 30;
monthdays[6] = 31;
monthdays[7] = 31;
monthdays[8] = 30;
monthdays[9] = 31;
monthdays[10] = 30;
monthdays[11] = 31;
todayDate = new Date();
thisday = todayDate.getDay();
thismonth = todayDate.getMonth();
thisdate = todayDate.getDate();
thisyear = todayDate.getYear();
thisyear = thisyear % 100;
thisyear = ((thisyear &lt; 50) ? (2000 + thisyear) : (1900 + thisyear));
if (((thisyear % 4 == 0) &amp;&amp; !(thisyear % 100 == 0)) || (thisyear % 400 == 0)) {
    monthdays[0]++;
}
startspaces = thisdate;
while (startspaces &gt; 7) {
    startspaces -= 7;
    startspaces = thisday - startspaces + 1;
}
if (startspaces &lt; 0) {
    startspaces += 7;
}

document.write("&lt;table border=1 bgcolor=white ");
document.write("bordercolor=black&gt;&lt;font color=black&gt;");
document.write("&lt;tr&gt;&lt;td colspan=7&gt;&lt;center&gt;&lt;strong&gt;" + monthnames[thismonth] + " " + thisyear + "&lt;/strong&gt;&lt;/center&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;");
document.write("&lt;tr&gt;");
document.write("&lt;td align=center&gt;Su&lt;/td&gt;");
document.write("&lt;td align=center&gt;M&lt;/td&gt;");
document.write("&lt;td align=center&gt;Tu&lt;/td&gt;");
document.write("&lt;td align=center&gt;W&lt;/td&gt;");
document.write("&lt;td align=center&gt;Th&lt;/td&gt;");
document.write("&lt;td align=center&gt;F&lt;/td&gt;");
document.write("&lt;td align=center&gt;Sa&lt;/td&gt;");
document.write("&lt;/tr&gt;");
document.write("&lt;tr&gt;");
for (s = 0; s &lt; startspaces; s++) {
    document.write("&lt;td&gt; &lt;/td&gt;");
}
count = 1;
while (count &lt;= monthdays[thismonth]) {
    for (b = startspaces; b &lt; 7; b++)

    {
        linktrue = false;
        document.write("&lt;td&gt;");
        for (c = 0; c &lt; linkdays.length; c++)

        {
            if (linkdays[c] != null)

            {
                if ((linkdays[c][0] == thismonth + 1) &amp;&amp; (linkdays[c][2] == count)) {
                    document.write("&lt;a href=\"" + linkdays[c][2] + "\"&gt;");
                    linktrue = true;
                }
            }
        }
        if (count == thisdate) {
            document.write("&lt;font color='FF0000'&gt;&lt;strong&gt;");
        }
        if (count &lt;= monthdays[thismonth]) {
            document.write(count);
        }
        else {
            document.write(" ");
        }
        if (count == thisdate) {
            document.write("&lt;/strong&gt;&lt;/font&gt;");
        }
        if (linktrue) {
            document.write("&lt;/a&gt;");
        }
        document.write("&lt;/td&gt;");
        count++;
    }
    document.write("&lt;/tr&gt;");
    document.write("&lt;tr&gt;");
    startspaces = 0;
}
document.write("&lt;/table&gt;&lt;/p&gt;");
&lt;/SCRIPT&gt; 
</code></pre>
