?? calendar.js
字號:
/* Author: Mihai Bazon, September 2002
* http://students.infoiasi.ro/~mishoo
*
* Version: 0.9
*
* 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.
*/
// the Calendar object constructor.
Calendar = function (mondayFirst, dateStr, yourHandler, yourCloseHandler) {
// member variables
this.activeDateEl = null;
this.activeMonEl = null;
this.activeYearEl = null;
this.currentDateEl = null;
this.disabledHandler = null;
this.timeout = null;
this.yourHandler = yourHandler || null;
this.yourCloseHandler = yourCloseHandler || null;
this.dragging = false;
this.minYear = 1970;
this.maxYear = 2050;
this.dateFormat = "y-mm-dd";
this.isPopup = true;
this.mondayFirst = mondayFirst;
this.dateStr = dateStr;
};
// ** constants
// "static", needed for event handlers.
Calendar._C = null;
Calendar.is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
(navigator.userAgent.toLowerCase().indexOf("opera") == -1) );
Calendar._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
// ** public functions (these can be thought as static, since none of them use
// ** "this" and they can be accessed without using an instance of the object).
Calendar.getAbsolutePos = function(el) {
var r = { x: el.offsetLeft, y: el.offsetTop };
if (el.offsetParent) {
var tmp = Calendar.getAbsolutePos(el.offsetParent);
r.x += tmp.x;
r.y += tmp.y;
}
return r;
};
Calendar._add_evs = function(el) {
Calendar.addEvent(el, "mouseover", Calendar.dayMouseOver);
Calendar.addEvent(el, "mousedown", Calendar.dayMouseDown);
Calendar.addEvent(el, "mouseout", Calendar.dayMouseOut);
if (Calendar.is_ie) {
Calendar.addEvent(el, "dblclick", Calendar.dayMouseDblClick);
el.setAttribute("unselectable", true);
}
};
Calendar._del_evs = function(el) {
Calendar.removeEvent(el, "mouseover", Calendar.dayMouseOver);
Calendar.removeEvent(el, "mousedown", Calendar.dayMouseDown);
Calendar.removeEvent(el, "mouseout", Calendar.dayMouseOut);
if (Calendar.is_ie) {
Calendar.removeEvent(el, "dblclick", Calendar.dayMouseDblClick);
}
};
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.getMonthDays = function(year, month) {
if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
return 29;
} else {
return Calendar._MD[month];
}
};
Calendar.removeClass = function(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(" ");
};
Calendar.addClass = function(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) {
if (Calendar.is_ie) {
window.event.cancelBubble = true;
window.event.returnValue = false;
} else {
ev.preventDefault();
ev.stopPropagation();
}
};
Calendar.addEvent = function(el, evname, func) {
if (Calendar.is_ie) {
el.attachEvent("on" + evname, func);
} else {
el.addEventListener(evname, func, true);
}
};
Calendar.removeEvent = function(el, evname, func) {
if (Calendar.is_ie) {
el.detachEvent("on" + evname, func);
} else {
el.removeEventListener(evname, func, 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.tableMouseUp = function(ev) {
var cal = Calendar._C;
if (!cal) {
return false;
}
if (cal.timeout) {
clearTimeout(cal.timeout);
}
var el = cal.activeDateEl;
if (!el) {
return false;
}
var target = Calendar.getTargetElement(ev);
Calendar.removeClass(el, "active");
if (target == el || target.parentNode == el) {
Calendar.cellClick(el);
}
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);
}
} 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);
}
}
}
Calendar.removeEvent(document, "mouseup", Calendar.tableMouseUp);
Calendar.removeEvent(document, "mouseover", Calendar.tableMouseOver);
Calendar.removeEvent(document, "mousemove", Calendar.tableMouseOver);
cal.hideCombos();
Calendar.stopEvent(ev);
Calendar._C = null;
};
Calendar.tableMouseOver = function (ev) {
var cal = Calendar._C;
if (!cal) {
return;
}
var el = cal.activeDateEl;
var target = Calendar.getTargetElement(ev);
if (target == el || target.parentNode == el) {
Calendar.addClass(el, "hilite active");
} else {
Calendar.removeClass(el, "active");
Calendar.removeClass(el, "hilite");
}
var mon = Calendar.findMonth(target);
var date = null;
if (mon) {
date = new Date(cal.date);
if (mon.month != date.getMonth()) {
if (cal.activeMonEl) {
Calendar.removeClass(cal.activeMonEl, "hilite");
}
Calendar.addClass(mon, "hilite");
cal.activeMonEl = mon;
}
} else {
var year = Calendar.findYear(target);
if (year) {
date = new Date(cal.date);
if (year.year != date.getFullYear()) {
if (cal.activeYearEl) {
Calendar.removeClass(cal.activeYearEl, "hilite");
}
Calendar.addClass(year, "hilite");
cal.activeYearEl = year;
}
}
}
Calendar.stopEvent(ev);
};
Calendar.tableMouseDown = function (ev) {
if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
Calendar.stopEvent(ev);
}
};
Calendar.showMonthsCombo = function () {
var cal = Calendar._C;
if (!cal) {
return false;
}
var cal = cal;
var cd = cal.activeDateEl;
var mc = cal.monthsCombo;
if (cal.activeMonEl) {
Calendar.removeClass(cal.activeMonEl, "hilite");
}
var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
Calendar.addClass(mon, "hilite");
cal.activeMonEl = mon;
mc.style.left = cd.offsetLeft;
mc.style.top = cd.offsetTop + cd.offsetHeight;
mc.style.display = "block";
};
Calendar.showYearsCombo = function (fwd) {
var cal = Calendar._C;
if (!cal) {
return false;
}
var cal = cal;
var cd = cal.activeDateEl;
var yc = cal.yearsCombo;
if (cal.activeYearEl) {
Calendar.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";
}
};
Calendar.calDragIt = function (ev) {
var cal = Calendar._C;
if (!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";
Calendar.stopEvent(ev);
};
Calendar.calDragEnd = function (ev) {
var cal = Calendar._C;
cal.dragging = false;
Calendar.removeEvent(document, "mousemove", Calendar.calDragIt);
Calendar.removeEvent(document, "mouseover", Calendar.stopEvent);
Calendar.removeEvent(document, "mouseup", Calendar.calDragEnd);
Calendar.tableMouseUp(ev);
cal.hideShowCovered();
};
Calendar.dayMouseDown = function(ev) {
var el = Calendar.getElement(ev);
var cal = el.calendar;
cal.activeDateEl = el;
Calendar._C = cal;
if (el.navtype != 300) {
Calendar.addClass(el, "hilite active");
Calendar.addEvent(document, "mouseover", Calendar.tableMouseOver);
Calendar.addEvent(document, "mousemove", Calendar.tableMouseOver);
Calendar.addEvent(document, "mouseup", Calendar.tableMouseUp);
} else if (cal.isPopup) {
cal.dragStart(ev);
}
Calendar.stopEvent(ev);
if (el.navtype == -1 || el.navtype == 1) {
cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
} else if (el.navtype == -2 || el.navtype == 2) {
cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
} else {
cal.timeout = null;
}
};
Calendar.dayMouseDblClick = function(ev) {
Calendar.cellClick(Calendar.getElement(ev));
if (Calendar.is_ie) {
document.selection.empty();
}
};
Calendar.dayMouseOver = function(ev) {
var el = Calendar.getElement(ev);
if (Calendar.isRelated(el, ev) || Calendar._C) {
return false;
}
if (el.ttip) {
el.calendar.tooltips.firstChild.data = el.ttip;
}
if (el.navtype != 300) {
Calendar.addClass(el, "hilite");
}
Calendar.stopEvent(ev);
};
Calendar.dayMouseOut = function(ev) {
var el = Calendar.getElement(ev);
if (Calendar.isRelated(el, ev) || Calendar._C) {
return false;
}
Calendar.removeClass(el, "hilite");
el.calendar.tooltips.firstChild.data = Calendar._TT["SEL_DATE"];
Calendar.stopEvent(ev);
};
Calendar.datesEqual = function(a, b) {
return ((a.getFullYear() == b.getFullYear()) &&
(a.getMonth() == b.getMonth()) &&
(a.getDate() == b.getDate()));
};
Calendar.cellClick = function(el) {
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;
}
date = el.caldate;
cal.date = date;
newdate = true;
} else {
if (el.navtype == 200) {
Calendar.removeClass(el, "hilite");
cal.callCloseHandler();
return;
}
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 = Calendar.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 (!Calendar.datesEqual(date, cal.date)) {
cal.setDate(date);
newdate = el.navtype == 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -