var userAccount = new Object();
//Set force locale EN to user for displaying calendar.
userAccount.locale = 'en';
userAccount.colorPatternId = 'blue';
var calendarPath = '';
document.write("<link rel='stylesheet' type='text/css' href='resource/stylesheet/calendar/calendar-blue.css'/>");
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
    // member variables
    this.activeDiv = null;
    this.currentDateEl = null;
    this.getDateStatus = null;
    this.timeout = null;
    this.onSelected = onSelected || null;
    this.onClose = onClose || null;
    this.dragging = false;
    this.hidden = false;
    this.minYear = 1970;
    this.maxYear = 2050;
    this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
    this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
    this.isPopup = true;
    this.weekNumbers = true;
    this.firstDayOfWeek = firstDayOfWeek; // 0 for Sunday, 1 for Monday, etc.
    this.showsOtherMonths = false;
    this.dateStr = dateStr;
    this.ar_days = null;
    this.showsTime = false;
    this.time24 = true;
    this.yearStep = 2;
    // HTML elements
    this.table = null;
    this.element = null;
    this.tbody = null;
    this.firstdayname = null;
    // Combo boxes
    this.monthsCombo = null;
    this.yearsCombo = null;
    this.hilitedMonth = null;
    this.activeMonth = null;
    this.hilitedYear = null;
    this.activeYear = null;
    // Information
    this.dateClicked = false;    // one-time initializations
    if (typeof Calendar._SDN == "undefined") {
        // table of short day names
        if (typeof Calendar._SDN_len == "undefined")
            Calendar._SDN_len = 3;
        var ar = new Array();
        for (var i = 8; i > 0;) {
            ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
        }
        Calendar._SDN = ar;
        // table of short month names
        if (typeof Calendar._SMN_len == "undefined")
            Calendar._SMN_len = 3;
        ar = new Array();
        for (var i = 12; i > 0;) {
            ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
        }
        Calendar._SMN = ar;
    }
};Calendar._C = null;Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
           !/opera/i.test(navigator.userAgent) );Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );Calendar.is_opera = /opera/i.test(navigator.userAgent);Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos = function(el) {
    var SL = 0, ST = 0;
    var is_div = /^div$/i.test(el.tagName);
    if (is_div && el.scrollLeft)
        SL = el.scrollLeft;
    if (is_div && el.scrollTop)
        ST = el.scrollTop;
    var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
    if (el.offsetParent) {
        var tmp = this.getAbsolutePos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
};Calendar.isRelated = function (el, evt) {
    var related = evt.relatedTarget;
    if (!related) {
        var type = evt.type;
        if (type == "mouseover") {
            related = evt.fromElement;
        } else if (type == "mouseout") {
            related = evt.toElement;
        }
    }
    while (related) {
        if (related == el) {
            return true;
        }
        related = related.parentNode;
    }
    return false;
};Calendar.removeClass = function(el, className) {
    if (!(el && el.className)) {
        return;
    }
    var cls = el.className.split(" ");
    var ar = new Array();
    for (var i = cls.length; i > 0;) {
        if (cls[--i] != className) {
            ar[ar.length] = cls[i];
        }
    }
    el.className = ar.join(" ");
};Calendar.addClass = function(el, className) {
    Calendar.removeClass(el, className);
    el.className += " " + className;
};Calendar.getElement = function(ev) {
    if (Calendar.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.currentTarget;
    }
};Calendar.getTargetElement = function(ev) {
    if (Calendar.is_ie) {
        return window.event.srcElement;
    } else {
        return ev.target;
    }
};Calendar.stopEvent = function(ev) {
    ev || (ev = window.event);
    if (Calendar.is_ie) {
        ev.cancelBubble = true;
        ev.returnValue = false;
    } else {
        ev.preventDefault();
        ev.stopPropagation();
    }
    return false;
};Calendar.addEvent = function(el, evname, func) {
    if (el.attachEvent ) { // IE
        el.attachEvent("on" + evname, func);
    } else if (el.addEventListener) { // Gecko / W3C
        el.addEventListener(evname, func, true);
    } else {
        el["on" + evname] = func;
    }
};Calendar.removeEvent = function(el, evname, func) {
    if (el.detachEvent) { // IE
        el.detachEvent("on" + evname, func);
    } else if (el.removeEventListener) { // Gecko / W3C
        el.removeEventListener(evname, func, true);
    } else {
        el["on" + evname] = null;
    }
};Calendar.createElement = function(type, parent) {
    var el = null;
    if (document.createElementNS) {
        el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
    } else {
        el = document.createElement(type);
    }
    if (typeof parent != "undefined") {
        parent.appendChild(el);
    }
    return el;
};Calendar._add_evs = function(el) {
    with (Calendar) {
        addEvent(el, "mouseover", dayMouseOver);
        addEvent(el, "mousedown", dayMouseDown);
        addEvent(el, "mouseout", dayMouseOut);
        if (is_ie) {
            addEvent(el, "dblclick", dayMouseDblClick);
            el.setAttribute("unselectable", true);
        }
    }
};Calendar.findMonth = function(el) {
    if (typeof el.month != "undefined") {
        return el;
    } else if (typeof el.parentNode.month != "undefined") {
        return el.parentNode;
    }
    return null;
};Calendar.findYear = function(el) {
    if (typeof el.year != "undefined") {
        return el;
    } else if (typeof el.parentNode.year != "undefined") {
        return el.parentNode;
    }
    return null;
};Calendar.showMonthsCombo = function () {
    var cal = Calendar._C;
    if (!cal) {
        return false;
    }
    var cal = cal;
    var cd = cal.activeDiv;
    var mc = cal.monthsCombo;
    if (cal.hilitedMonth) {
        Calendar.removeClass(cal.hilitedMonth, "hilite");
    }
    if (cal.activeMonth) {
        Calendar.removeClass(cal.activeMonth, "active");
    }
    var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
    Calendar.addClass(mon, "active");
    cal.activeMonth = mon;
    var s = mc.style;
    s.display = "block";
    if (cd.navtype < 0)
        s.left = cd.offsetLeft + "px";
    else {
        var mcw = mc.offsetWidth;
        if (typeof mcw == "undefined")
            mcw = 50;
        s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
    }
    s.top = (cd.offsetTop + cd.offsetHeight) + "px";
};Calendar.showYearsCombo = function (fwd) {
    var cal = Calendar._C;
    if (!cal) {
        return false;
    }
    var cal = cal;
    var cd = cal.activeDiv;
    var yc = cal.yearsCombo;
    if (cal.hilitedYear) {
        Calendar.removeClass(cal.hilitedYear, "hilite");
    }
    if (cal.activeYear) {
        Calendar.removeClass(cal.activeYear, "active");
    }
    cal.activeYear = null;
    var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
    var yr = yc.firstChild;
    var show = false;
    for (var i = 12; i > 0; --i) {
        if (Y >= cal.minYear && Y <= cal.maxYear) {
            yr.firstChild.data = Y;
            yr.year = Y;
            yr.style.display = "block";
            show = true;
        } else {
            yr.style.display = "none";
        }
        yr = yr.nextSibling;
        Y += fwd ? cal.yearStep : -cal.yearStep;
    }
    if (show) {
        var s = yc.style;
        s.display = "block";
        if (cd.navtype < 0)
            s.left = cd.offsetLeft + "px";
        else {
            var ycw = yc.offsetWidth;
            if (typeof ycw == "undefined")
                ycw = 50;
            s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
        }
        s.top = (cd.offsetTop + cd.offsetHeight) + "px";
    }
};

解决方案 »

  1.   

    Calendar.tableMouseUp = function(ev) {
        var cal = Calendar._C;
        if (!cal) {
            return false;
        }
        if (cal.timeout) {
            clearTimeout(cal.timeout);
        }
        var el = cal.activeDiv;
        if (!el) {
            return false;
        }
        var target = Calendar.getTargetElement(ev);
        ev || (ev = window.event);
        Calendar.removeClass(el, "active");
        if (target == el || target.parentNode == el) {
            Calendar.cellClick(el, ev);
        }
        var mon = Calendar.findMonth(target);
        var date = null;
        if (mon) {
            date = new Date(cal.date);
            if (mon.month != date.getMonth()) {
                date.setMonth(mon.month);
                cal.setDate(date);
                cal.dateClicked = false;
                cal.callHandler();
            }
        } else {
            var year = Calendar.findYear(target);
            if (year) {
                date = new Date(cal.date);
                if (year.year != date.getFullYear()) {
                    date.setFullYear(year.year);
                    cal.setDate(date);
                    cal.dateClicked = false;
                    cal.callHandler();
                }
            }
        }
        with (Calendar) {
            removeEvent(document, "mouseup", tableMouseUp);
            removeEvent(document, "mouseover", tableMouseOver);
            removeEvent(document, "mousemove", tableMouseOver);
            cal._hideCombos();
            _C = null;
            return stopEvent(ev);
        }
    };Calendar.tableMouseOver = function (ev) {
        var cal = Calendar._C;
        if (!cal) {
            return;
        }
        var el = cal.activeDiv;
        var target = Calendar.getTargetElement(ev);
        if (target == el || target.parentNode == el) {
            Calendar.addClass(el, "hilite active");
            Calendar.addClass(el.parentNode, "rowhilite");
        } else {
            if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
                Calendar.removeClass(el, "active");
            Calendar.removeClass(el, "hilite");
            Calendar.removeClass(el.parentNode, "rowhilite");
        }
        ev || (ev = window.event);
        if (el.navtype == 50 && target != el) {
            var pos = Calendar.getAbsolutePos(el);
            var w = el.offsetWidth;
            var x = ev.clientX;
            var dx;
            var decrease = true;
            if (x > pos.x + w) {
                dx = x - pos.x - w;
                decrease = false;
            } else
                dx = pos.x - x;        if (dx < 0) dx = 0;
            var range = el._range;
            var current = el._current;
            var count = Math.floor(dx / 10) % range.length;
            for (var i = range.length; --i >= 0;)
                if (range[i] == current)
                    break;
            while (count-- > 0)
                if (decrease) {
                    if (--i < 0)
                        i = range.length - 1;
                } else if ( ++i >= range.length )
                    i = 0;
            var newval = range[i];
            el.firstChild.data = newval;        cal.onUpdateTime();
        }
        var mon = Calendar.findMonth(target);
        if (mon) {
            if (mon.month != cal.date.getMonth()) {
                if (cal.hilitedMonth) {
                    Calendar.removeClass(cal.hilitedMonth, "hilite");
                }
                Calendar.addClass(mon, "hilite");
                cal.hilitedMonth = mon;
            } else if (cal.hilitedMonth) {
                Calendar.removeClass(cal.hilitedMonth, "hilite");
            }
        } else {
            if (cal.hilitedMonth) {
                Calendar.removeClass(cal.hilitedMonth, "hilite");
            }
            var year = Calendar.findYear(target);
            if (year) {
                if (year.year != cal.date.getFullYear()) {
                    if (cal.hilitedYear) {
                        Calendar.removeClass(cal.hilitedYear, "hilite");
                    }
                    Calendar.addClass(year, "hilite");
                    cal.hilitedYear = year;
                } else if (cal.hilitedYear) {
                    Calendar.removeClass(cal.hilitedYear, "hilite");
                }
            } else if (cal.hilitedYear) {
                Calendar.removeClass(cal.hilitedYear, "hilite");
            }
        }
        return Calendar.stopEvent(ev);
    };Calendar.tableMouseDown = function (ev) {
        if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
            return Calendar.stopEvent(ev);
        }
    };Calendar.calDragIt = function (ev) {
        var cal = Calendar._C;
        if (!(cal && cal.dragging)) {
            return false;
        }
        var posX;
        var posY;
        if (Calendar.is_ie) {
            posY = window.event.clientY + document.body.scrollTop;
            posX = window.event.clientX + document.body.scrollLeft;
        } else {
            posX = ev.pageX;
            posY = ev.pageY;
        }
        cal.hideShowCovered();
        var st = cal.element.style;
        st.left = (posX - cal.xOffs) + "px";
        st.top = (posY - cal.yOffs) + "px";
        return Calendar.stopEvent(ev);
    };Calendar.calDragEnd = function (ev) {
        var cal = Calendar._C;
        if (!cal) {
            return false;
        }
        cal.dragging = false;
        with (Calendar) {
            removeEvent(document, "mousemove", calDragIt);
            removeEvent(document, "mouseup", calDragEnd);
            tableMouseUp(ev);
        }
        cal.hideShowCovered();
    };Calendar.dayMouseDown = function(ev) {
        var el = Calendar.getElement(ev);
        if (el.disabled) {
            return false;
        }
        var cal = el.calendar;
        cal.activeDiv = el;
        Calendar._C = cal;
        if (el.navtype != 300) with (Calendar) {
            if (el.navtype == 50) {
                el._current = el.firstChild.data;
                addEvent(document, "mousemove", tableMouseOver);
            } else
                addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
            addClass(el, "hilite active");
            addEvent(document, "mouseup", tableMouseUp);
        } else if (cal.isPopup) {
            cal._dragStart(ev);
        }
        if (el.navtype == -1 || el.navtype == 1) {
            if (cal.timeout) clearTimeout(cal.timeout);
            cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
        } else if (el.navtype == -2 || el.navtype == 2) {
            if (cal.timeout) clearTimeout(cal.timeout);
            cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
        } else {
            cal.timeout = null;
        }
        return Calendar.stopEvent(ev);
    };
    Calendar.dayMouseDblClick = function(ev) {
        Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
        if (Calendar.is_ie) {
            document.selection.empty();
        }
    };Calendar.dayMouseOver = function(ev) {
        var el = Calendar.getElement(ev);
        if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
            return false;
        }
        if (el.ttip) {
            if (el.ttip.substr(0, 1) == "_") {
                el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
            }
            el.calendar.tooltips.firstChild.data = el.ttip;
        }
        if (el.navtype != 300) {
            Calendar.addClass(el, "hilite");
            if (el.caldate) {
                Calendar.addClass(el.parentNode, "rowhilite");
            }
        }
        return Calendar.stopEvent(ev);
    };Calendar.dayMouseOut = function(ev) {
        with (Calendar) {
            var el = getElement(ev);
            if (isRelated(el, ev) || _C || el.disabled) {
                return false;
            }
            removeClass(el, "hilite");
            if (el.caldate) {
                removeClass(el.parentNode, "rowhilite");
            }
            el.calendar.tooltips.firstChild.data = _TT["SEL_DATE"];
            return stopEvent(ev);
        }
    };
      

  2.   

    控件的官网一般都会有demo下载,下载下来改改就可以了
      

  3.   

    Calendar.cellClick = function(el, ev) {
        var cal = el.calendar;
        var closing = false;
        var newdate = false;
        var date = null;
        if (typeof el.navtype == "undefined") {
            Calendar.removeClass(cal.currentDateEl, "selected");
            Calendar.addClass(el, "selected");
            closing = (cal.currentDateEl == el);
            if (!closing) {
                cal.currentDateEl = el;
            }
            cal.date = new Date(el.caldate);
            date = cal.date;
            newdate = true;
            // a date was clicked
            if (!(cal.dateClicked = !el.otherMonth))
                cal._init(cal.firstDayOfWeek, date);
        } else {
            if (el.navtype == 200) {
                Calendar.removeClass(el, "hilite");
                cal.callCloseHandler();
                return;
            }
            date = (el.navtype == 0) ? new Date() : new Date(cal.date);
            cal.dateClicked = false;
            var year = date.getFullYear();
            var mon = date.getMonth();
            function setMonth(m) {
                var day = date.getDate();
                var max = date.getMonthDays(m);
                if (day > max) {
                    date.setDate(max);
                }
                date.setMonth(m);
            };
            switch (el.navtype) {
                case 400:
                Calendar.removeClass(el, "hilite");
                var text = Calendar._TT["ABOUT"];
                if (typeof text != "undefined") {
                    text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
                } else {
                    text = "";
                }
                //alert(text);
                return;
                case -2:
                if (year > cal.minYear) {
                    date.setFullYear(year - 1);
                }
                break;
                case -1:
                if (mon > 0) {
                    setMonth(mon - 1);
                } else if (year-- > cal.minYear) {
                    date.setFullYear(year);
                    setMonth(11);
                }
                break;
                case 1:
                if (mon < 11) {
                    setMonth(mon + 1);
                } else if (year < cal.maxYear) {
                    date.setFullYear(year + 1);
                    setMonth(0);
                }
                break;
                case 2:
                if (year < cal.maxYear) {
                    date.setFullYear(year + 1);
                }
                break;
                case 100:
                cal.setFirstDayOfWeek(el.fdow);
                return;
                case 50:
                var range = el._range;
                var current = el.firstChild.data;
                for (var i = range.length; --i >= 0;)
                    if (range[i] == current)
                        break;
                if (ev && ev.shiftKey) {
                    if (--i < 0)
                        i = range.length - 1;
                } else if ( ++i >= range.length )
                    i = 0;
                var newval = range[i];
                el.firstChild.data = newval;
                cal.onUpdateTime();
                return;
                case 0:
                // TODAY will bring us here
                if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
                    // remember, "date" was previously set to new
                    // Date() if TODAY was clicked; thus, it
                    // contains today date.
                    return false;            }
                break;
            }
            if (!date.equalsTo(cal.date)) {
                cal.setDate(date);
                newdate = true;
            }
        }
        if (newdate) {
            cal.callHandler();
        }
        if (closing) {
            Calendar.removeClass(el, "hilite");
            cal.callCloseHandler();
        }
    };
      

  4.   

    Calendar.prototype.create = function (_par) {
        var parent = null;
        if (! _par) {
            // default parent is the document body, in which case we create
            // a popup calendar.
            parent = document.getElementsByTagName("body")[0];
            this.isPopup = true;
        } else {
            parent = _par;
            this.isPopup = false;
        }
        this.date = this.dateStr ? new Date(this.dateStr) : new Date();    var table = Calendar.createElement("table");
        this.table = table;
        table.cellSpacing = 0;
        table.cellPadding = 0;
        table.calendar = this;
        Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);    var div = Calendar.createElement("div");
        this.element = div;
        div.className = "calendar";
        if (this.isPopup) {
            div.style.position = "absolute";
            div.style.display = "none";
        }
        div.appendChild(table);    var thead = Calendar.createElement("thead", table);
        var cell = null;
        var row = null;    var cal = this;
        var hh = function (text, cs, navtype) {
            cell = Calendar.createElement("td", row);
            cell.colSpan = cs;
            cell.className = "button";
            if (navtype != 0 && Math.abs(navtype) <= 2)
                cell.className += " nav";
            if (navtype != 400 ) Calendar._add_evs(cell); //update 2005/10/31--for isp503
            cell.calendar = cal;
            cell.navtype = navtype;
            if (text.substr(0, 1) != "&") {
                cell.appendChild(document.createTextNode(text));
            }
            else {
                // FIXME: dirty hack for entities
                cell.innerHTML = text;
            }
            return cell;
        };    row = Calendar.createElement("tr", thead);
        var title_length = 6;
        (this.isPopup) && --title_length;
        (this.weekNumbers) && ++title_length;    //hh("?", 1, 400).ttip = Calendar._TT["INFO"];
    hh(" ", 1, 400).ttip = Calendar._TT["INFO"];
        this.title = hh("", title_length, 300);
        this.title.className = "title";
        if (this.isPopup) {
            this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
            this.title.style.cursor = "move";
            hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
        }    row = Calendar.createElement("tr", thead);
        row.className = "headrow";    this._nav_py = hh("&#x00ab;", 1, -2);
        this._nav_py.ttip = Calendar._TT["PREV_YEAR"];    this._nav_pm = hh("&#x2039;", 1, -1);
        this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];    this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
        this._nav_now.ttip = Calendar._TT["GO_TODAY"];    this._nav_nm = hh("&#x203a;", 1, 1);
        this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];    this._nav_ny = hh("&#x00bb;", 1, 2);
        this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];    // day names
        row = Calendar.createElement("tr", thead);
        row.className = "daynames";
        if (this.weekNumbers) {
            cell = Calendar.createElement("td", row);
            cell.className = "name wn";
            cell.appendChild(document.createTextNode(Calendar._TT["WK"]));
        }
        for (var i = 7; i > 0; --i) {
            cell = Calendar.createElement("td", row);
            cell.appendChild(document.createTextNode(""));
            if (!i) {
                cell.navtype = 100;
                cell.calendar = this;
                Calendar._add_evs(cell);
            }
        }
        this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
        this._displayWeekdays();    var tbody = Calendar.createElement("tbody", table);
        this.tbody = tbody;    for (i = 6; i > 0; --i) {
            row = Calendar.createElement("tr", tbody);
            if (this.weekNumbers) {
                cell = Calendar.createElement("td", row);
                cell.appendChild(document.createTextNode(""));
            }
            for (var j = 7; j > 0; --j) {
                cell = Calendar.createElement("td", row);
                cell.appendChild(document.createTextNode(""));
                cell.calendar = this;
                Calendar._add_evs(cell);
            }
        }    if (this.showsTime) {
            row = Calendar.createElement("tr", tbody);
            row.className = "time";        cell = Calendar.createElement("td", row);
            cell.className = "time";
            cell.colSpan = 2;
            cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";        cell = Calendar.createElement("td", row);
            cell.className = "time";
            cell.colSpan = this.weekNumbers ? 4 : 3;        (function(){
                function makeTimePart(className, init, range_start, range_end) {
                    var part = Calendar.createElement("span", cell);
                    part.className = className;
                    part.appendChild(document.createTextNode(init));
                    part.calendar = cal;
                    part.ttip = Calendar._TT["TIME_PART"];
                    part.navtype = 50;
                    part._range = [];
                    if (typeof range_start != "number")
                        part._range = range_start;
                    else {
                        for (var i = range_start; i <= range_end; ++i) {
                            var txt;
                            if (i < 10 && range_end >= 10) txt = '0' + i;
                            else txt = '' + i;
                            part._range[part._range.length] = txt;
                        }
                    }
                    Calendar._add_evs(part);
                    return part;
                };
                var hrs = cal.date.getHours();
                var mins = cal.date.getMinutes();
                var t12 = !cal.time24;
                var pm = (hrs > 12);
                if (t12 && pm) hrs -= 12;
                var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
                var span = Calendar.createElement("span", cell);
                span.appendChild(document.createTextNode(":"));
                span.className = "colon";
                var M = makeTimePart("minute", mins, 0, 59);
                var AP = null;
                cell = Calendar.createElement("td", row);
                cell.className = "time";
                cell.colSpan = 2;
                if (t12)
                    AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
                else
                    cell.innerHTML = "&nbsp;";            cal.onSetTime = function() {
                    var hrs = this.date.getHours();
                    var mins = this.date.getMinutes();
                    var pm = (hrs > 12);
                    if (pm && t12) hrs -= 12;
                    H.firstChild.data = (hrs < 10) ? ("0" + hrs) : hrs;
                    M.firstChild.data = (mins < 10) ? ("0" + mins) : mins;
                    if (t12)
                        AP.firstChild.data = pm ? "pm" : "am";
                };            cal.onUpdateTime = function() {
                    var date = this.date;
                    var h = parseInt(H.firstChild.data, 10);
                    if (t12) {
                        if (/pm/i.test(AP.firstChild.data) && h < 12)
                            h += 12;
                        else if (/am/i.test(AP.firstChild.data) && h == 12)
                            h = 0;
                    }
                    var d = date.getDate();
                    var m = date.getMonth();
                    var y = date.getFullYear();
                    date.setHours(h);
                    date.setMinutes(parseInt(M.firstChild.data, 10));
                    date.setFullYear(y);
                    date.setMonth(m);
                    date.setDate(d);
                    this.dateClicked = false;
                    this.callHandler();
                };
            })();
        } else {
            this.onSetTime = this.onUpdateTime = function() {};
        }    var tfoot = Calendar.createElement("tfoot", table);    row = Calendar.createElement("tr", tfoot);
        row.className = "footrow";    cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
        cell.className = "ttip";
        if (this.isPopup) {
            cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
            cell.style.cursor = "move";
        }
        this.tooltips = cell;    div = Calendar.createElement("div", this.element);
        this.monthsCombo = div;
        div.className = "combo";
        for (i = 0; i < Calendar._MN.length; ++i) {
            var mn = Calendar.createElement("div");
            mn.className = Calendar.is_ie ? "label-IEfix" : "label";
            mn.month = i;
            mn.appendChild(document.createTextNode(Calendar._SMN[i]));
            div.appendChild(mn);
        }    div = Calendar.createElement("div", this.element);
        this.yearsCombo = div;
        div.className = "combo";
        for (i = 12; i > 0; --i) {
            var yr = Calendar.createElement("div");
            yr.className = Calendar.is_ie ? "label-IEfix" : "label";
            yr.appendChild(document.createTextNode(""));
            div.appendChild(yr);
        }    this._init(this.firstDayOfWeek, this.date);
        parent.appendChild(this.element);
    };
      

  5.   

    Calendar._keyEvent = function(ev) {
        if (!window.calendar) {
            return false;
        }
        (Calendar.is_ie) && (ev = window.event);
        var cal = window.calendar;
        var act = (Calendar.is_ie || ev.type == "keypress");
        if (ev.ctrlKey) {
            switch (ev.keyCode) {
                case 37: // KEY left
                act && Calendar.cellClick(cal._nav_pm);
                break;
                case 38: // KEY up
                act && Calendar.cellClick(cal._nav_py);
                break;
                case 39: // KEY right
                act && Calendar.cellClick(cal._nav_nm);
                break;
                case 40: // KEY down
                act && Calendar.cellClick(cal._nav_ny);
                break;
                default:
                return false;
            }
        } else switch (ev.keyCode) {
            case 32: // KEY space (now)
            Calendar.cellClick(cal._nav_now);
            break;
            case 27: // KEY esc
            act && cal.callCloseHandler();
            break;
            case 37: // KEY left
            case 38: // KEY up
            case 39: // KEY right
            case 40: // KEY down
            if (act) {
                var date = cal.date.getDate() - 1;
                var el = cal.currentDateEl;
                var ne = null;
                var prev = (ev.keyCode == 37) || (ev.keyCode == 38);
                switch (ev.keyCode) {
                    case 37: // KEY left
                    (--date >= 0) && (ne = cal.ar_days[date]);
                    break;
                    case 38: // KEY up
                    date -= 7;
                    (date >= 0) && (ne = cal.ar_days[date]);
                    break;
                    case 39: // KEY right
                    (++date < cal.ar_days.length) && (ne = cal.ar_days[date]);
                    break;
                    case 40: // KEY down
                    date += 7;
                    (date < cal.ar_days.length) && (ne = cal.ar_days[date]);
                    break;
                }
                if (!ne) {
                    if (prev) {
                        Calendar.cellClick(cal._nav_pm);
                    } else {
                        Calendar.cellClick(cal._nav_nm);
                    }
                    date = (prev) ? cal.date.getMonthDays() : 1;
                    el = cal.currentDateEl;
                    ne = cal.ar_days[date - 1];
                }
                Calendar.removeClass(el, "selected");
                Calendar.addClass(ne, "selected");
                cal.date = new Date(ne.caldate);
                cal.callHandler();
                cal.currentDateEl = ne;
            }
            break;
            case 13: // KEY enter
            if (act) {
                cal.callHandler();
                cal.hide();
            }
            break;
            default:
            return false;
        }
        return Calendar.stopEvent(ev);
    };/**
     *  (RE)Initializes the calendar to the given date and firstDayOfWeek
     */
    Calendar.prototype._init = function (firstDayOfWeek, date) {
        var today = new Date();
        this.table.style.visibility = "hidden";
        var year = date.getFullYear();
        if (year < this.minYear) {
            year = this.minYear;
            date.setFullYear(year);
        } else if (year > this.maxYear) {
            year = this.maxYear;
            date.setFullYear(year);
        }
        this.firstDayOfWeek = firstDayOfWeek;
        this.date = new Date(date);
        var month = date.getMonth();
        var mday = date.getDate();
        var no_days = date.getMonthDays();    // calendar voodoo for computing the first day that would actually be
        // displayed in the calendar, even if it's from the previous month.
        // WARNING: this is magic. ;-)
        date.setDate(1);
        var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
        if (day1 < 0)
            day1 += 7;
        date.setDate(-day1);
        date.setDate(date.getDate() + 1);    var row = this.tbody.firstChild;
        var MN = Calendar._SMN[month];
        var ar_days = new Array();
        var weekend = Calendar._TT["WEEKEND"];
        for (var i = 0; i < 6; ++i, row = row.nextSibling) {
            var cell = row.firstChild;
            if (this.weekNumbers) {
                cell.className = "day wn";
                cell.firstChild.data = date.getWeekNumber();
                cell = cell.nextSibling;
            }
            row.className = "daysrow";
            var hasdays = false;
            for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(date.getDate() + 1)) {
                var iday = date.getDate();
                var wday = date.getDay();
                cell.className = "day";
                var current_month = (date.getMonth() == month);
                if (!current_month) {
                    if (this.showsOtherMonths) {
                        cell.className += " othermonth";
                        cell.otherMonth = true;
                    } else {
                        cell.className = "emptycell";
                        cell.innerHTML = "&nbsp;";
                        cell.disabled = true;
                        continue;
                    }
                } else {
                    cell.otherMonth = false;
                    hasdays = true;
                }
                cell.disabled = false;
                cell.firstChild.data = iday;
                if (typeof this.getDateStatus == "function") {
                    var status = this.getDateStatus(date, year, month, iday);
                    if (status === true) {
                        cell.className += " disabled";
                        cell.disabled = true;
                    } else {
                        if (/disabled/i.test(status))
                            cell.disabled = true;
                        cell.className += " " + status;
                    }
                }
                if (!cell.disabled) {
                    ar_days[ar_days.length] = cell;
                    cell.caldate = new Date(date);
                    cell.ttip = "_";
                    if (current_month && iday == mday) {
                        cell.className += " selected";
                        this.currentDateEl = cell;
                    }
                    if (date.getFullYear() == today.getFullYear() &&
                        date.getMonth() == today.getMonth() &&
                        iday == today.getDate()) {
                        cell.className += " today";
                        cell.ttip += Calendar._TT["PART_TODAY"];
                    }
                    if (weekend.indexOf(wday.toString()) != -1) {
                        cell.className += cell.otherMonth ? " oweekend" : " weekend";
                    }
                }
            }
            if (!(hasdays || this.showsOtherMonths))
                row.className = "emptyrow";
        }
        this.ar_days = ar_days;
        this.title.firstChild.data = Calendar._MN[month] + ", " + year;
        this.onSetTime();
        this.table.style.visibility = "visible";
        // PROFILE
        // this.tooltips.firstChild.data = "Generated in " + ((new Date()) - today) + " ms";
    };/**
     *  Calls _init function above for going to a certain date (but only if the
     *  date is different than the currently selected one).
     */
    Calendar.prototype.setDate = function (date) {
        if (!date.equalsTo(this.date)) {
            this._init(this.firstDayOfWeek, date);
        }
    };/**
     *  Refreshes the calendar.  Useful if the "disabledHandler" function is
     *  dynamic, meaning that the list of disabled date can change at runtime.
     *  Just * call this function if you think that the list of disabled dates
     *  should * change.
     */
    Calendar.prototype.refresh = function () {
        this._init(this.firstDayOfWeek, this.date);
    };/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */
    Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
        this._init(firstDayOfWeek, this.date);
        this._displayWeekdays();
    };/**
     *  Allows customization of what dates are enabled.  The "unaryFunction"
     *  parameter must be a function object that receives the date (as a JS Date
     *  object) and returns a boolean value.  If the returned value is true then
     *  the passed date will be ed as disabled.
     */
    Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
        this.getDateStatus = unaryFunction;
    };/** Customization of allowed year range for the calendar. */
    Calendar.prototype.setRange = function (a, z) {
        this.minYear = a;
        this.maxYear = z;
    };/** Calls the first user handler (selectedHandler). */
    Calendar.prototype.callHandler = function () {
        if (this.onSelected) {
            this.onSelected(this, this.date.print(this.dateFormat));
        }
    };/** Calls the second user handler (closeHandler). */
    Calendar.prototype.callCloseHandler = function () {
        if (this.onClose) {
            this.onClose(this);
        }
        this.hideShowCovered();
    };/** Removes the calendar object from the DOM tree and destroys it. */
    Calendar.prototype.destroy = function () {
        var el = this.element.parentNode;
        el.removeChild(this.element);
        Calendar._C = null;
        window.calendar = null;
    };
    Calendar.prototype.reparent = function (new_parent) {
        var el = this.element;
        el.parentNode.removeChild(el);
        new_parent.appendChild(el);
    };// This gets called when the user presses a mouse button anywhere in the
    // document, if the calendar is shown.  If the click was outside the open
    // calendar this function closes it.
    Calendar._checkCalendar = function(ev) {
        if (!window.calendar) {
            return false;
        }
        var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
        for (; el != null && el != calendar.element; el = el.parentNode);
        if (el == null) {
            // calls closeHandler which should hide the calendar.
            window.calendar.callCloseHandler();
            return Calendar.stopEvent(ev);
        }
    };
      

  6.   

    太夸张了。建议用my97date吧。。
    http://www.my97.net/
      

  7.   

    看他的api 然后引入js