function CDateSelector()
{
    var $m_objDate;
    var $m_aMonths = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
    var $m_aDayss = new Array("S", "M", "T", "W", "R", "T", "S");
    var $m_strFieldId;
    var $m_objField;
    var $m_strDivId;
    var $m_strObjName;

    this.setDate = setDate;
    function setDate($objDate)
    {
        if ( $objDate != null )
        {
            $m_objDate = $objDate;
        }
        else
        {
            // Look for the right form
            for ( var $n = 0; $n < top.document.forms.length; $n++ )
            {
                $m_objField = eval("top.document.forms[$n]." + $m_strFieldId);
                if ( $m_objField != null )
                {
                    var $strDate = eval("top.document.forms[$n]." + $m_strFieldId + ".value");
                    $m_objDate = createDateFromStr($strDate);
                    break;
                }
            }
        }
    }

    this.setFieldId = setFieldId
    function setFieldId($str)
    {
        $m_strFieldId = $str;
    }

    this.setDivId = setDivId;
    function setDivId($str)
    {
        $m_strDivId = $str;
    }

    this.setObjName = setObjName;
    function setObjName($str)
    {
        $m_strObjName = $str;
    }

    this.showCalendar = showCalendar;
    function showCalendar()
    {
        var $nDay = $m_objDate.getDate();
        var $nMonth = $m_objDate.getMonth();
        var $nYear = $m_objDate.getFullYear();

        var $objThisMonth = new Date($nYear, $nMonth, 1);
        var $objNextMonth = new Date($nYear, $nMonth + 1, 1);

        // Find today
        var $objToday = new Date();
        var $nTodayDay = $objToday.getDate();
        var $nTodayMonth = $objToday.getMonth();
        var $nTodayYear = $objToday.getFullYear();

        var $objThisMonth = new Date($nYear, $nMonth, 1);
        var $objNextMonth = new Date($nYear, $nMonth + 1, 1);

        // Find today
        var $objToday = new Date();
        var $nTodayDay = $objToday.getDate();

        // Find out when this month starts and ends.
        var $nDaysThisMonth = Math.round(($objNextMonth.getTime() - $objThisMonth.getTime()) / (1000 * 60 * 60 * 24));

        var $strHtml = monthNavBar($objThisMonth);
        $strHtml += "<table class=\"dateselector\">\n";
        $strHtml += "<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>\n";

        $strHtml += "<tr>";
        // Fill the first week of the month with the appropriate number of blanks.
        var $nStartDay = $objThisMonth.getDay();
        for( var $n = 1; $n <= $nStartDay; $n++ )
        {
            $strHtml += "<td>&nbsp;</td>";
        }

        // Print all the days of the month
        var $nDayOfTheWeek = $objThisMonth.getDay();
        for( var $n = 1; $n <= $nDaysThisMonth; $n++)
        {
            $nDayOfTheWeek %= 7;
            if ( $nDayOfTheWeek == 0 )
            {
                $strHtml += "</tr>\n";
                $strHtml += "<tr>";
            }

            $strHtml += "<td";
            // Need to compare Month and Year, too
            if ( $n == $nTodayDay && $nMonth == $nTodayMonth && $nYear == $nTodayYear )
            {
                $strHtml += " class=\"today\"";
            }
            $strHtml += "><a href=\"javascript:" + $m_strObjName + ".chooseDate('" + $nYear + "-" + pad($nMonth + 1) + "-" + pad($n) + "');\">" + $n + "</a></td>";
            $nDayOfTheWeek++;
        }

        // Fill the rest of the week
        for ( var $n = $nDayOfTheWeek; $n < 7; $n++ )
        {
            $strHtml += "<td>&nbsp;</td>";
        }

        $strHtml += "</tr>\n";
        $strHtml += "</table>\n";

        document.getElementById($m_strDivId).innerHTML = $strHtml;
        document.getElementById($m_strDivId).style.visibility = "visible";
    }

    function monthNavBar($objDate)
    {
        var $objLast = new Date($objDate.getFullYear(), $objDate.getMonth() - 1, 1);
        var $strLastMonth = $objLast.getFullYear() + "-" + pad($objLast.getMonth() + 1) + "-" + pad($objLast.getDate());
        var $objNext = new Date($objDate.getFullYear(), $objDate.getMonth() + 1, 1);
        var $strNextMonth = $objNext.getFullYear() + "-" + pad($objNext.getMonth() + 1) + "-" + pad($objNext.getDate());

        var $str = "<p>";
        $str += "<a href=\"javascript:" + $m_strObjName + ".moveCalendar('" + $strLastMonth + "');\">";
        $str += $m_aMonths[$objLast.getMonth()] + " " + shortYear($objLast.getFullYear()) + "</a> | ";
        $str += $m_aMonths[$objDate.getMonth()] + " " + shortYear($objDate.getFullYear()) + " | ";
        $str += "<a href=\"javascript:" + $m_strObjName + ".moveCalendar('" + $strNextMonth + "');\">";
        $str += $m_aMonths[$objNext.getMonth()] + " " + shortYear($objNext.getFullYear()) + "</a>";
        $str += "</p>\n";
        return $str;
    }

    function shortYear($n)
    {
        // Convert to string, then chop off first two characters
        $n = $n + '';
        return "'" + $n.substring(2);
    }

    this.moveCalendar = moveCalendar;
    function moveCalendar($strDate)
    {
        var $objDate = createDateFromStr($strDate);
        setDate($objDate);
        showCalendar();
    }

    function pad($n)
    {
        var $str = $n + '';
        if ( $str.length == 1 )
        {
            $str = "0" + $str;
        }
        return $str;
    }

    this.chooseDate = chooseDate;
    function chooseDate($strDate)
    {
        $m_objField.value = $strDate;
        document.getElementById($m_strDivId).style.visibility = "hidden";
    }

    function createDateFromStr($strDate)
    {
        var $objDate = new Date();
        var $strRegEx = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
        if ( $strDate.match($strRegEx) )
        {
            var $strYear = $strDate.substring(0, 4);
            var $strMonth = $strDate.substring(5, 7);
            var $strDay = $strDate.substring(8, 10);
            $objDate = new Date($strYear, $strMonth - 1, $strDay);
        }
        return $objDate;
    }
}
