📄 calendar.js
字号:
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Version: 0.8
*
* Feel free to use this script under the terms of the GNU General Public
* License, as long as you do not remove or alter this notice.
*/
var _MN = new Array(
"一月" ,//"January"
"二月" ,//"February"
"三月" ,//"March"
"四月" ,//"April"
"五月" ,//"May"
"六月" ,//"June"
"七月" ,//"July"
"八月" ,//"August"
"九月" ,//"September"
"十月" ,//"October"
"十一月" ,//"November"
"十二月" //"December"
);
var _DN = new Array(
"日" , //"Sunday"
"一" , //"Monday"
"二" , //"Tuesday"
"三" , //"Wednesday"
"四" , //"Thursday"
"五" , //"Friday"
"六" , //"Saturday"
"日" //"Sunday"
);
var _MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var agt = navigator.userAgent.toLowerCase();
var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var _C = null;
function isRelated(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;
}
function getMonthDays(year, month) {
if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) return 29;
else return _MD[month];
}
function removeClass(el, className) {
if (!(el && el.className)) return;
var classes = el.className.split(" ");
var newClasses = new Array;
for (i = 0; i < classes.length; ++i)
if (classes[i] != className) newClasses[newClasses.length] = classes[i];
el.className = newClasses.join(" ");
}
function addClass(el, className) {
el.className += " " + className;
}
function getElement(ev) {
if (is_ie) return window.event.srcElement;
else return ev.currentTarget;
}
function getTargetElement(ev) {
if (is_ie) return window.event.srcElement;
else return ev.target;
}
function stopEvent(ev) {
if (is_ie) {
window.event.cancelBubble = true;
window.event.returnValue = false;
} else {
ev.preventDefault();
ev.stopPropagation();
}
}
function addEvent(el, evname, func) {
if (is_ie) el.attachEvent("on" + evname, func);
else el.addEventListener(evname, func, true);
}
function removeEvent(el, evname, func) {
if (is_ie) el.detachEvent("on" + evname, func);
else el.removeEventListener(evname, func, true);
}
function findMonth(el) {
if (typeof el.month != 'undefined') return el;
else if (typeof el.parentNode.month != 'undefined') return el.parentNode;
return null;
}
function findYear(el) {
if (typeof el.year != 'undefined') return el;
else if (typeof el.parentNode.year != 'undefined') return el.parentNode;
return null;
}
function tableMouseUp(ev) {
if (!_C) return;
var cal = _C;
if (cal.timeout) clearTimeout(cal.timeout);
var el = cal.activeDateEl;
if (!el) return;
var target = getTargetElement(ev);
removeClass(el, "active");
if (target == el || target.parentNode == el) cellClick(el);
var mon = findMonth(target);
if (mon) {
var date = new Date(cal.date);
if (mon.month != date.getMonth()) {
date.setMonth(mon.month);
cal.setDate(date);
}
} else {
var year = findYear(target);
if (year) {
var date = new Date(cal.date);
if (year.year != date.getFullYear()) {
date.setFullYear(year.year);
cal.setDate(date);
}
}
}
removeEvent(document, "mouseup", tableMouseUp);
removeEvent(document, "mouseover", tableMouseOver);
removeEvent(document, "mousemove", tableMouseOver);
el = null;
_C.hideCombos();
_C = null;
stopEvent(ev);
}
function tableMouseOver(ev) {
if (!_C) return;
var cal = _C;
var el = cal.activeDateEl;
var target = getTargetElement(ev);
if (target == el || target.parentNode == el) addClass(el, "hilite active");
else {
removeClass(el, "active");
removeClass(el, "hilite");
}
var mon = findMonth(target);
if (mon) {
var date = new Date(cal.date);
if (mon.month != date.getMonth()) {
if (cal.activeMonEl)
removeClass(cal.activeMonEl, "hilite");
addClass(mon, "hilite");
cal.activeMonEl = mon;
}
} else {
var year = findYear(target);
if (year) {
var date = new Date(cal.date);
if (year.year != date.getFullYear()) {
if (cal.activeYearEl)
removeClass(cal.activeYearEl, "hilite");
addClass(year, "hilite");
cal.activeYearEl = year;
}
}
}
stopEvent(ev);
}
function tableMouseDown(ev) { if (getTargetElement(ev) == getElement(ev)) stopEvent(ev); }
function showMonthsCombo() {
if (!_C) return;
var cal = _C;
var cd = cal.activeDateEl;
var mc = cal.monthsCombo;
if (cal.activeMonEl)
removeClass(cal.activeMonEl, "hilite");
var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
addClass(mon, "hilite");
cal.activeMonEl = mon;
mc.style.left = cd.offsetLeft;
mc.style.top = cd.offsetTop + cd.offsetHeight;
mc.style.display = "block";
}
function showYearsCombo(fwd) {
if (!_C) return;
var cal = _C;
var cd = cal.activeDateEl;
var yc = cal.yearsCombo;
if (cal.activeYearEl)
removeClass(cal.activeYearEl, "hilite");
cal.activeYearEl = null;
var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
var yr = yc.firstChild;
var show = false;
for (var i = 0; i < 12; ++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 ? 2 : -2;
}
if (show) {
yc.style.left = cd.offsetLeft;
yc.style.top = cd.offsetTop + cd.offsetHeight;
yc.style.display = "block";
}
}
function calDragIt(ev) {
if (!_C.dragging) return;
var posX;
var posY;
if (is_ie) {
posY = window.event.clientY + document.body.scrollTop;
posX = window.event.clientX + document.body.scrollLeft;
} else {
posX = ev.pageX;
posY = ev.pageY;
}
var st = _C.element.style;
st.left = (posX - _C.xOffs) + "px";
st.top = (posY - _C.yOffs) + "px";
stopEvent(ev);
}
function calDragEnd(ev) {
_C.dragging = false;
removeEvent(document, "mousemove", calDragIt);
removeEvent(document, "mouseover", stopEvent);
removeEvent(document, "mouseup", calDragEnd);
tableMouseUp(ev);
}
function dayMouseDown(ev) {
var el = getElement(ev);
var cal = el.calendar;
cal.activeDateEl = el;
_C = cal;
if (el.navtype == 300)
cal.dragStart(ev);
else {
addClass(el, "hilite active");
addEvent(document, "mouseover", tableMouseOver);
addEvent(document, "mousemove", tableMouseOver);
addEvent(document, "mouseup", tableMouseUp);
}
stopEvent(ev);
if (el.navtype == -1 || el.navtype == 1) {
cal.timeout = setTimeout("showMonthsCombo()", 250);
} else if (el.navtype == -2 || el.navtype == 2) {
cal.timeout = setTimeout((el.navtype > 0) ? "showYearsCombo(true)" : "showYearsCombo(false)", 250);
} else cal.timeout = null;
}
function dayMouseDblClick(ev) { cellClick(getElement(ev)); if (is_ie) { document.selection.empty(); } }
function dayMouseOver(ev) {
var el = getElement(ev);
if (isRelated(el, ev) || _C) return;
if (el.ttip) el.calendar.tooltips.firstChild.data = el.ttip;
if (el.navtype != 300) addClass(el, "hilite");
stopEvent(ev);
}
function dayMouseOut(ev) {
var el = getElement(ev);
if (isRelated(el, ev) || _C) return;
removeClass(el, "hilite");
el.calendar.tooltips.firstChild.data = "选择日期"; //Select date
stopEvent(ev);
}
function datesEqual(a, b) {
return a.getFullYear() == b.getFullYear() && a.getMonth() == b.getMonth() && a.getDate() == b.getDate();
}
function cellClick(el) {
var cal = el.calendar;
var closing = false;
var newdate = false;
if (typeof el.navtype == 'undefined') {
removeClass(cal.currentDateEl, "selected");
addClass(el, "selected");
closing = cal.currentDateEl == el;
if (!closing) cal.currentDateEl = el;
var date = el.caldate;
cal.date = date;
newdate = true;
} else {
if (el.navtype == 200) {
cal.callCloseHandler();
return;
}
var date = (el.navtype == 0) ? new Date() : new Date(cal.date);
var year = date.getFullYear();
var mon = date.getMonth();
var setMonth = function (mon) {
var day = date.getDate();
var max = getMonthDays(year, mon);
if (day > max) date.setDate(max);
date.setMonth(mon);
}
switch (el.navtype) {
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.setMondayFirst(!cal.mondayFirst);
return;
}
if (!datesEqual(date, cal.date)) {
cal.setDate(date);
newdate = el.navtype == 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -