function show_calendar(str_target, str_datetime) {
    var arr_months = ["January", "February", "March", "April",
                      "May", "June", "July", "August",
                                                "September", "October", "November", "December"];
//    var arr_months = ["一","二","三","四","五","六","七","八","九","十","十一","十二"];
    var week_days = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
//    var week_days = ["日","一","二","三","四","五","六"];
//    var mountname = "月";
    var n_weekstart = 0; // day week starts from (normally 0 or 1)
        var fface = "face=\"Ming(ISO10646), arial,  tahoma, verdana\"";
    var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime));
    var dt_prev_month = new Date(dt_datetime);
    dt_prev_month.setMonth(dt_datetime.getMonth() - 1);
    var dt_next_month = new Date(dt_datetime);
    dt_next_month.setMonth(dt_datetime.getMonth() + 1);
    var dt_firstday = new Date(dt_datetime);
    dt_firstday.setDate(1);
    dt_firstday.setDate(1 - (7 + dt_firstday.getDay() - n_weekstart) % 7);
    var dt_lastday = new Date(dt_next_month);
    dt_lastday.setDate(0);
    var str_buffer = new String ("<html><head><title>Calendar</title></head>"
                   + "<body bgcolor=\"White\" topmargin=\"5\" leftmargin=\"5\">"
                                   + "<div align=\"center\">"

                   + "<table width=\"100%\" cellspacing=\"1\" cellpadding=\"3\" "
                   + "border=\"0\" bgcolor=\"#46B482\"><tr>"

                   + "<td width=\"14%\" align=\"left\">"
                   + "<a href=\"javascript:window.opener.show_calendar('"
                   + str_target + "', '" + dt2dtstr(dt_prev_month)
                   + "');\"><img src=\"image/calender_prev.gif\" border=\"0\" alt=\"previous month\"></a></td>"

                   + "<td width=\"72%\" align=\"center\">"
                   + "<font color=\"white\" " + fface + " size=\"3\"><b>"
                   + arr_months[dt_datetime.getMonth()] //+ mountname
                   + " " + dt_datetime.getFullYear() + "</b></font></td>"

                   + "<td width=\"14%\" align=\"right\">"
                   + "<a href=\"javascript:window.opener.show_calendar('"
                   + str_target + "', '" + dt2dtstr(dt_next_month)
                   + "');\"><img src=\"image/calender_next.gif\" border=\"0\" alt=\"next month\"></a>"
                                   + "</td></tr></table><table width=\"100%\" cellspacing=\"0\" border=\"1\"><tr>");

    for (var n=0; n<7; n++)
        str_buffer += "<td bgcolor=\"#87FACE\" align=\"center\">"
                    + "<font color=\"#000000\" " + fface + " size=\"2\"><b>"
                    + week_days[(n_weekstart + n) % 7] + "</b></font></td>";
    str_buffer += "</tr>";
    var dt_current_day = new Date(dt_firstday);
    // print calendar table
    while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
           dt_current_day.getMonth() == dt_firstday.getMonth()) {
        str_buffer += "<tr>";
        for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
                    str_buffer += "<td  align=\"right\" bgcolor=\"#";
            if (dt_current_day.getDate() == dt_datetime.getDate() &&
                dt_current_day.getMonth() == dt_datetime.getMonth())
                 str_buffer += "FFB6C1";// print current date
            else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
                 str_buffer += "DBF5EA";// weekend days
            else str_buffer += "FFFFFF";// print working days of current month

            str_buffer += "\"><a href=\"javascript:window.opener." + str_target + ".value='"
                                                + dt2dtstr(dt_current_day) + "'; window.close();\"><font color=\"#"
                                                + ((dt_current_day.getMonth() == dt_datetime.getMonth())? "000000" : "9F9F9F")
                                                + "\" " + fface + " size=\"2\">" + dt_current_day.getDate() + "</font></a></td>";
            dt_current_day.setDate(dt_current_day.getDate() + 1);
        }
        str_buffer += "</tr>";
    }
    str_buffer += "</table></body></html>";
    var vWinCal = window.open("", "Calendar", "top=200,left=200,width=200,height=200"
                                                                                        + ",menubar=no,toolbar=no,location=no,status=no"
                                                                                        + ",resizable=no,directories=no,scrollbars=no");
    vWinCal.opener = self;
    var calc_doc = vWinCal.document;
    calc_doc.write (str_buffer);
    calc_doc.close();
}
// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
    var re_date = /^(\d+)\-(\d+)\-(\d+)$/;
    if (!re_date.exec(str_datetime)) return alert("Invalid Datetime format: " + str_datetime);
    return (new Date (RegExp.$1, (RegExp.$2 - 1), RegExp.$3));
}
function dt2dtstr (dt_datetime) {
    return (new String (dt_datetime.getFullYear()
                   + "-" + (dt_datetime.getMonth() + 1)
                           + "-" +  dt_datetime.getDate()));
}
