📄 rich_calendar.js
字号:
month = date.getMonth();
}
if (month==1 && RichCalendar.is_leap_year(year)) {
return 29;
} else {
//alert(month + ' -> ' + RichCalendar.month_days[month]);
return RichCalendar.month_days[month];
}
}
// return true if year is a leap year
RichCalendar.is_leap_year = function(year) {
return (year%4==0 && year%100!=0 || year%400==0) ? true : false;
}
// return day of the year
RichCalendar.get_day_of_year = function(date) {
var now = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);
var year_start = new Date(date.getFullYear(), 0, 0, 0, 0, 0);
// milliseconds in day
var day_in_msecs = 24*60*60*1000;
return Math.floor((now - year_start) / day_in_msecs);
}
// add class to element
RichCalendar.add_class = function(el, class_name) {
RichCalendar.remove_class(el, class_name);
el.className += " " + class_name;
}
// remove class from element
RichCalendar.remove_class = function(el, class_name) {
if (!el || !el.className) return
var new_class_parts = [];
var class_parts = String(el.className).split(" ");
var i;
for (i=0; i<class_parts.length; i++) {
if (class_parts[i] != "" && class_parts[i] != class_name) {
new_class_parts[new_class_parts.length] = class_parts[i];
}
}
el.className = new_class_parts.join(" ");
}
// return position of object obj; dont go above stop_obj in DOM structure
RichCalendar.get_obj_pos = function(obj, stop_obj){
var pos = Array(0,0);
if (!obj) return pos;
while (obj && stop_obj != obj) {
//absolute positioned element => do not count its offset values
if (obj.currentStyle) {
if (obj.currentStyle.position == 'absolute') break;
} else {
if (document.defaultView.getComputedStyle(obj, '').getPropertyValue('position') == 'absolute') break;
}
var is_div = obj.tagName.toUpperCase() == "DIV" ? true : false;
pos[0] += obj.offsetLeft - (is_div?obj.scrollLeft:0);
pos[1] += obj.offsetTop - (is_div?obj.scrollTop:0);
/*
// Opera returns negative offsets (but we took it into account
// when substitute scrollLeft/Top of the parent elements)
// so we use Math.max to prevent double reducing of the positions
pos[0] += Math.max(obj.offsetLeft, 0) - obj.scrollLeft;
pos[1] += Math.max(obj.offsetTop, 0) - obj.scrollTop;
*/
obj = obj.offsetParent;
}
return pos;
}
// array of text data in various languages
RichCalendar.rc_lang_data = [];
// number of days in months
RichCalendar.month_days = [31,28,31,30,31,30,31,31,30,31,30,31];
// currently shown calendars
RichCalendar.active_calendars = [];
// true if all document handlers are set
RichCalendar.handlert_set = false;
// Calendar API
// show calendar inside/before/after (defined by argument position) element el
// if any specified or in the point specified (if any)
RichCalendar.prototype.show = function(x, y, el, position) {
if (!this.value_el) {
this.value_el = el;
}
this.position = position;
this.iframe_obj = document.createElement('IFRAME');
this.iframe_obj.className = 'rc_calendar'+RichCalendar.skin_suffix(this.skin);
this.iframe_obj.setAttribute('scrolling', 'no');
this.iframe_obj.calendar = this;
// relative positioning
if (this.is_relative_position(position)) {
switch (position) {
case "before":
if (el.parentNode) {
el.parentNode.insertBefore(this.iframe_obj, el);
}
break;
case "after":
if (el.parentNode) {
el.parentNode.insertBefore(this.iframe_obj, el.nextSibling);
}
break;
case "child":
default:
el.appendChild(this.iframe_obj);
this.position = 'child';
break;
}
} else { // absolute positioning
this.iframe_obj.style.position = 'absolute';
// move the iframe to the position specified
var left = parseInt(x);
var top = parseInt(y);
if (typeof(x) == 'number' && typeof(y) == 'number') {
this.iframe_obj.style.left = x + 'px';
this.iframe_obj.style.top = y + 'px';
}
this.iframe_obj.style.border = '1px solid #000000';
this.iframe_obj.value = this.value;
document.body.appendChild(this.iframe_obj);
}
// styles to add to iframe
var iframe_styles = RichCalendar.get_iframe_styles();
// put calendar content into the iframe
var iframe_content = '' +
'<html>' +
'<head>' +
'<style type="text/css">'+iframe_styles+'</style>' +
'</head>' +
'<body class="rc_iframe_body' + RichCalendar.skin_suffix(this.skin) + '" id="rc_body">' +
'</body></html>' +
'';
this.iframe_doc = this.iframe_obj.contentWindow.document;
this.iframe_doc.open();
this.iframe_doc.write(iframe_content);
this.iframe_doc.close();
RichCalendar.attach_event(this.iframe_doc, 'mousedown', RichCalendar.document_onmousedown);
this.body_obj = this.iframe_doc.getElementById('rc_body');
this.body_obj.calendar = this;
// main table
this.table_obj = this.iframe_doc.createElement('TABLE');
this.table_obj.className = 'rc_table';
this.table_obj.setAttribute('id', 'rc_iframe_table');
this.table_obj.cellSpacing = 0;
this.table_obj.cellPadding = 0;
// store reference to the calendar
this.table_obj.calendar = this;
// header row
this.head_tr = this.table_obj.insertRow(0);
this.head_tr.className = 'rc_head_tr';
this.clear_td = this.head_tr.insertCell(0);
this.clear_td.innerHTML = 'c';
this.clear_td.rc_object_code = 'clear';
this.clear_td.calendar = this;
RichCalendar.attach_events(this.clear_td);
//this.clear_td.className = 'rc_head_tr';
this.head_td = this.head_tr.insertCell(1);
//this.head_td.className = 'rc_head_tr';
this.head_td.colSpan = 5;
//this.head_td.innerHTML = 'asdf';
this.close_td = this.head_tr.insertCell(2);
this.close_td.innerHTML = 'x';
this.close_td.rc_object_code = 'close';
this.close_td.calendar = this;
RichCalendar.attach_events(this.close_td);
//this.close_td.className = 'rc_head_tr';
// navigation row
this.nav_tr = this.table_obj.insertRow(1);
this.nav_tr.className = 'rc_nav_tr';
this.prev_year_td = this.nav_tr.insertCell(0);
this.prev_year_td.innerHTML = '«';
this.prev_year_td.rc_object_code = 'prev_year';
this.prev_year_td.calendar = this;
RichCalendar.attach_events(this.prev_year_td);
this.prev_month_td = this.nav_tr.insertCell(1);
this.prev_month_td.innerHTML = '‹';
this.prev_month_td.rc_object_code = 'prev_month';
this.prev_month_td.calendar = this;
RichCalendar.attach_events(this.prev_month_td);
this.today_td = this.nav_tr.insertCell(2);
this.today_td.colSpan = 3;
this.today_td.innerHTML = this.text('today');
this.today_td.rc_object_code = 'today';
this.today_td.calendar = this;
RichCalendar.attach_events(this.today_td);
this.next_month_td = this.nav_tr.insertCell(3);
this.next_month_td.innerHTML = '›';
this.next_month_td.rc_object_code = 'next_month';
this.next_month_td.calendar = this;
RichCalendar.attach_events(this.next_month_td);
this.next_year_td = this.nav_tr.insertCell(4);
this.next_year_td.innerHTML = '»';
this.next_year_td.rc_object_code = 'next_year';
this.next_year_td.calendar = this;
RichCalendar.attach_events(this.next_year_td);
// weekdays row
this.wd_tr = this.table_obj.insertRow(2);
this.wd_tr.className = 'rc_wd_tr';
var i;
// var day_names = this.text('dayNamesShort');
for (i=0; i<7; i++) {
// var wd = (i+this.start_week_day)%7;
var td = this.wd_tr.insertCell(i);
td.rc_object_code = 'week_day';
td.calendar = this;
RichCalendar.attach_events(td);
// td.innerHTML = day_names[wd];
// if (typeof(weekend_days[wd]) != "undefined") {
// td.className = "rc_weekend_head";
// }
}
// calendar rows (initially create min number of rows necessary - 4)
var rows_num = 4;
var row_indx;
var cell_indx;
this.cal_tr = [];
for (row_indx=0; row_indx<rows_num; row_indx++) {
this.create_cal_row(row_indx);
/*
this.cal_tr[row_indx] = this.table_obj.insertRow(3+row_indx);
this.cal_tr[row_indx].className = 'rc_cal_tr';
for (cell_indx=0; cell_indx<7; cell_indx++) {
var td = this.cal_tr[row_indx].insertCell(cell_indx);
td.innerHTML = row_indx + '-' + cell_indx;
}
*/
}
if (this.show_time) {
// create time row if necessary
this.time_tr = this.table_obj.insertRow(rows_num+3);
this.time_tr.className = 'rc_time_tr';
var td = this.time_tr.insertCell(0);
td.colSpan = 2;
td.innerHTML = this.text('time') + ':';
var td = this.time_tr.insertCell(1);
td.colSpan = 3;
this.hours_obj = this.createElement('INPUT', td);
this.hours_obj.className = 'rc_hours';
this.hours_obj.setAttribute('size', 1);
this.hours_obj.setAttribute('maxlength', 2);
this.colon_span = this.createElement('SPAN', td);
this.colon_span.className = 'rc_colon_span';
this.colon_span.innerHTML = ' : ';
this.mins_obj = this.createElement('INPUT', td);
this.mins_obj.className = 'rc_mins';
this.mins_obj.setAttribute('size', 1);
this.mins_obj.setAttribute('maxlength', 2);
var td = this.time_tr.insertCell(2);
td.colSpan = 2;
td.innerHTML = ' ';
}
// footer row
this.footer_tr = this.table_obj.insertRow(rows_num+3+(this.show_time?1:0));
this.footer_tr.className = 'rc_footer_tr';
this.footer_td = this.footer_tr.insertCell(0);
this.footer_td.colSpan = 7;
this.footer_td.innerHTML = this.text('footerDefaultText');
this.body_obj.appendChild(this.table_obj);
// create a DIV element to determine size of calendar
this.size_div = document.createElement('DIV');
this.size_div.className = this.body_obj.className;
this.size_div.style.position = "absolute";
this.size_div.style.left = "-1000px";
this.size_div.style.top = "-1000px";
document.body.appendChild(this.size_div);
// show current date in calendar
this.show_date();
// set document handlers if not set yet
if (!RichCalendar.handlers_set) {
RichCalendar.attach_event(document, 'mousedown', RichCalendar.document_onmousedown);
RichCalendar.handlers_set = true;
}
// store this calendar in array of active calendars
RichCalendar.active_calendars[RichCalendar.active_calendars.length] = this;
//alert(this.body_obj.innerHTML);
}
// hide calendar (destroy iframe object)
RichCalendar.prototype.hide = function() {
if (this.iframe_obj) {
this.iframe_obj.parentNode.removeChild(this.iframe_obj);
this.iframe_obj = null;
}
RichCalendar.make_inactive(this);
}
// show calendar inside/before/after (defined by argument position) element el
// ie relative to element el or
RichCalendar.prototype.show_at_element = function(el, position) {
if (typeof(el) != "object" || !el) return;
// relative positioning
if (this.is_relative_position(position)) {
this.show(null, null, el, position);
return;
}
/*
switch (position) {
case "before":
case "after":
case "child":
this.show(null, null, el, position);
return;
default:
break;
}
*/
// absolute positioning
var el_pos = RichCalendar.get_obj_pos(el);
// negative coordinates to make calendar invisible for a while
// as cannot determine right coordinates right now (calendar size is not
// known yet right after this.show worked)
var x = -1000;
var y = -1000;
this.show(x, y, el, position);
// fix position (need to do this later then calendar is shown as
// size of calendar could change in this.show(x, y)
// var cal = this;
// window.setTimeout(function(){cal.fix_position(el, position)}, 5);
}
// fix position of calendar
RichCalendar.prototype.fix_position = function(el) {
var position = this.position;
if (this.is_relative_position(position)) {
return;
}
if (!el) {
el = this.value_el;
}
// alert(el.getAttribute("id") + " => " + position);
var aligns = String(position).split("-");
if (aligns.length == 2) {
var el_pos = RichCalendar.get_obj_pos(el);
//alert(el_pos + ' => ' + el.offsetHeight);
var x = el_pos[0];
var y = el_pos[1] + el.offsetHeight;
// iframe border thikness
var border_width = parseInt(this.iframe_obj.style.borderWidth);
var cal_width = parseInt(this.iframe_obj.width) + 2*border_width;
var cal_height = parseInt(this.iframe_obj.height) + 2*border_width;
//alert('!: ' + cal_width + ' => ' + cal_height);
// horizontal alignment
switch (aligns[0]) {
case "left":
x -= cal_width;
break;
case "center":
x += (el.offsetWidth - cal_width) / 2;
break;
case "right":
x += el.offsetWidth;
break;
case "adj_right":
x += el.offsetWidth - cal_width;
break;
default:
break;
}
// vertical alignment
switch (aligns[1]) {
case "top":
y -= el.offsetHeight + cal_height;
break;
case "center":
y += (el.offsetHeight - cal_height) / 2 - el.offsetHeight;
break;
case "bottom":
break;
case "adj_bottom":
y -= cal_height;
break;
default:
break;
}
this.iframe_obj.style.left = x + 'px';
this.iframe_obj.style.top = y + 'px';
this.iframe_obj.style.visibility = 'visible';
}
}
// return true if calendar is relatively positioned
RichCalendar.prototype.is_relative_position = function(position) {
switch (position) {
case "before":
case "after":
case "child":
return true;
default:
return false;
}
}
// creates an element in iframe
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -