📄 rich_calendar.js
字号:
RichCalendar.prototype.createElement = function(tagName, parent) {
var el = this.iframe_doc.createElement(tagName);
if (parent) {
parent.appendChild(el);
}
return el;
}
// return text data desired
RichCalendar.prototype.text = function(name, language) {
if (typeof(language) == "undefined") {
language = this.language;
}
if (typeof(RichCalendar.rc_lang_data[language]) != "undefined") {
return typeof(RichCalendar.rc_lang_data[language][name]) != "undefined"?RichCalendar.rc_lang_data[language][name]:'';
}
return typeof(RichCalendar.rc_lang_data[this.default_language][name]) != "undefined"?RichCalendar.rc_lang_data[this.default_language][name]:'';
}
// show date in calendar
RichCalendar.prototype.show_date = function() {
// update week days row
// numbers of weekend days
var weekend_days = this.get_weekend_days();
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.cells[i];
td.innerHTML = day_names[wd];
if (typeof(weekend_days[wd]) != "undefined") {
td.className = "rc_weekend_head";
} else {
td.className = "";
}
// td.rc_object_code = 'week_day';
// td.calendar = this;
td.week_day_num = wd;
// RichCalendar.attach_events(td);
}
var month_days = RichCalendar.get_month_days(this.date);
// alert(month_days);
// first day of the same month and year as this.date
var date = new Date(this.date);
date.setDate(1);
var week_day = (date.getDay()+7-this.start_week_day)%7+1;
// alert(week_day);
// current data
var cur_year = this.date.getFullYear();
var cur_month = this.date.getMonth();
var cur_day = this.date.getDate();
//alert(cur_year + ' => ' + cur_month + ' => ' + cur_day);
// today
var today = new Date();
var today_year = today.getFullYear();
var today_month = today.getMonth();
var today_day = today.getDate();
//
var month_names = this.text('monthNames');
this.head_td.innerHTML = month_names[cur_month] + ', ' + cur_year;
var row;
var day;
var days = 0;
var last_row;
for (row=0; row<6; row++) {
// all days are shown => just check if need to remove unused rows
if (days == month_days) {
if (this.cal_tr[last_row+1]) {
this.cal_tr[last_row+1].parentNode.removeChild(this.cal_tr[last_row+1]);
this.cal_tr[row] = null;
}
continue;
}
for (day=0; day<7; day++) {
if (!this.cal_tr[row]) {
this.create_cal_row(row);
}
var cur_tr = this.cal_tr[row];
var cell = cur_tr.cells[day];
cell.className = "";
// should remove or IE attach the same event several times
RichCalendar.detach_events(cell);
if (row==0 && day+1 < week_day || days == month_days) {
var td_text = ' ';
// RichCalendar.detach_events(cell);
} else {
var day_num = days+1;
var td_text = day_num;
days++;
cell.rc_object_code = 'day';
cell.day_num = day_num;
cell.calendar = this;
RichCalendar.attach_events(cell);
// hilight current date
if (cur_day == day_num) {
RichCalendar.add_class(cell, "rc_current");
}
// hilight today date
if (day_num == today_day &&
cur_month == today_month &&
cur_year == today_year) {
RichCalendar.add_class(cell, "rc_today");
}
var wd = (day+this.start_week_day)%7;
// hilight weekend days
if (typeof(weekend_days[wd]) != "undefined") {
RichCalendar.add_class(cell, "rc_weekend_day");
} else {
RichCalendar.remove_class(cell, "rc_weekend_day");
}
}
cell.innerHTML = td_text;
if (days == month_days) {
last_row = row;
}
}
}
// set time
if (this.show_time && this.hours_obj && this.mins_obj) {
var hours = this.date.getHours();
if (hours < 10) hours = '0' + hours;
var mins = this.date.getMinutes();
if (mins < 10) mins = '0' + mins;
this.hours_obj.value = hours;
this.mins_obj.value = mins;
}
// change size of the iframe to fit to its content
/*
var table_obj = this.iframe_doc.getElementById('rc_iframe_table');
this.iframe_obj.width = table_obj.offsetWidth;
this.iframe_obj.height = table_obj.offsetHeight;
*/
var cal = this;
window.setTimeout(function(){cal.fit_to_content()}, 1);
// fix position (need to do this later then calendar is shown as
// size of calendar could change in this.show(x, y)
window.setTimeout(function(){cal.fix_position()}, 5);
}
// change size of the iframe to fit to its content
RichCalendar.prototype.fit_to_content = function() {
try {
var table_obj = this.iframe_doc.getElementById('rc_iframe_table');
this.iframe_obj.width = table_obj.offsetWidth;
this.iframe_obj.height = table_obj.offsetHeight;
//alert(this.iframe_obj.width + ' => ' + this.iframe_obj.height);
// sometimes IE return 0 values, so need to use another approach to
// determine size of the calendar
if (!parseInt(this.iframe_obj.width) || !parseInt(this.iframe_obj.height)) {
this.size_div.innerHTML = this.body_obj.innerHTML;
//alert(this.size_div.offsetWidth + ' => ' + this.size_div.offsetHeight);
this.iframe_obj.width = this.size_div.offsetWidth;
this.iframe_obj.height = this.size_div.offsetHeight;
}
}catch(e){}
}
// create calendar row
RichCalendar.prototype.create_cal_row = function(index) {
var row = this.table_obj.insertRow(3+index);
row.className = 'rc_cal_tr';
var cell_indx;
for (cell_indx=0; cell_indx<7; cell_indx++) {
var td = row.insertCell(cell_indx);
// td.innerHTML = index + '-' + cell_indx;
}
this.cal_tr[index] = row;
return row;
}
// changes calendar layout
RichCalendar.prototype.change_skin = function(skin) {
if (!this.iframe_obj) return;
var skin_suffix = RichCalendar.skin_suffix(skin);
this.iframe_obj.className = 'rc_calendar' + skin_suffix;
this.body_obj.className = 'rc_iframe_body' + skin_suffix;
this.skin = skin;
}
// returns formatted date (chars recognized are alike used by PHP function date)
RichCalendar.prototype.get_formatted_date = function(format, date) {
if (!date) date = this.date;
if (!format) format = this.get_date_format();
// set time
if (this.show_time && this.hours_obj && this.mins_obj) {
this.date.setHours(this.hours_obj.value);
var mins = this.date.setMinutes(this.mins_obj.value);
}
var y = date.getFullYear();
var m = date.getMonth();
var d = date.getDate();
var wd = date.getDay();
var hr = date.getHours();
var mins = date.getMinutes();
var secs = date.getSeconds();
var month_names_short = this.text('monthNamesShort');
var month_names = this.text('monthNames');
var day_names_short = this.text('dayNamesShort');
var day_names = this.text('dayNames');
var am = hr < 12 ? true : false;
var hr12 = hr > 12 ? hr - 12 : (hr == 0 ? 12 : hr);
var f = [];
f["%a"] = am?'am':'pm';
f["%A"] = am?'AM':'PM';
f["%d"] = d < 10 ? '0'+d : d; // day of the month, 2 digits with leading zeroes (01 to 31)
f["%D"] = day_names_short[wd]; // day of the week, textual, short, eg "Fri"
f["%F"] = month_names[m]; // month, textual, long; eg "January"
f["%h"] = hr12 < 10 ? '0' + hr12 : hr12; // hour, 12-hour format (01 to 12)
f["%H"] = hr < 10 ? '0' + hr : hr; // hour, 24-hour format (00 to 23)
f["%g"] = hr12; // hour, 12-hour format without leading zeros (1 to 12)
f["%G"] = hr; // hour, 24-hour format without leading zeros (0 to 23)
f["%i"] = mins < 10 ? '0' + mins : mins; // minutes (00 to 59)
f["%j"] = d; // day of the month without leading zeros (1 to 31)
f["%l"] = day_names[wd]; // day of the week, textual, long, eg "Friday"
f["%L"] = RichCalendar.is_leap_year(y)?1:0; // 1 if leap year, otherwise - 0
f["%m"] = m < 9 ? '0' + (m+1) : (m+1); //month (01 to 12)
f["%n"] = m + 1; //month without leading zeros (1 to 12)
f["%M"] = month_names_short[m]; // month, textual, short, eg "Jan"
f["%s"] = secs < 10 ? '0' + secs : secs; // seconds (00 to 59)
f["%t"] = RichCalendar.get_month_days(date); // number of days in the month (28 to 31)
f["%w"] = wd; // day of the week, numeric (0, Sunday to 6, Saturday)
f["%Y"] = y; // year, 4 digits, eg 2007
f["%y"] = String(y).substr(2, 2); // year, 2 digits, eg "07"
f["%z"] = RichCalendar.get_day_of_year(date); // day of the year (1 to 366)
var parts = String(format).match(/%./g);
var i;
var f_date = format;
for (i=0; i<parts.length; i++) {
var value = f[parts[i]];
if (typeof(value) != "undefined") {
var re = new RegExp(parts[i], 'g');
f_date = f_date.replace(re, value);
}
}
return f_date;
}
// set footer content
RichCalendar.prototype.set_footer_text = function(text) {
if (this.footer_td) {
this.footer_td.innerHTML = text;
}
}
// return array with keys - weekend days
RichCalendar.prototype.get_weekend_days = function() {
var weekend_days = this.text('weekend');
var weekend_parts = weekend_days.split(",");
var i;
var result = [];
for (i=0; i<weekend_parts.length; i++) {
result[weekend_parts[i]] = true;
}
return result;
}
// calendar on close handler; returns true if operation successfull
RichCalendar.prototype.onclose_handler = function() {
if (this.user_onclose_handler) {
this.user_onclose_handler(this);
} else {
this.hide();
}
}
// calendar on change handler
RichCalendar.prototype.onchange_handler = function(object_code) {
if (this.user_onchange_handler) {
this.user_onchange_handler(this, object_code);
} else {
if (object_code == 'day') {
if (this.value_el) this.value_el.value = this.get_formatted_date();
if (this.auto_close) this.hide();
} else {
}
}
}
// returns current date format
RichCalendar.prototype.get_date_format = function() {
var lang_date_format = this.text('dateFormat');
var format = lang_date_format?lang_date_format:this.format;
if (this.show_time) {
format += ' %H:%i';
}
return format;
}
// parses date from string str
RichCalendar.prototype.parse_date = function(str, format) {
if (typeof(str) == "undefined") {
return;
}
if (!format) format = this.get_date_format();
//alert(format);
var today = new Date();
var year = 0;
var month = -1;
var day = 0;
var hours = 0;
var mins = 0;
var seconds = 0;
var month_names = this.text('monthNames');
var short_month_names = this.text('monthNamesShort');
var en_month_names = this.text('monthNames', 'en');
var en_short_month_names = this.text('monthNamesShort', 'en');
//alert(month_names);
// national chars are not recognized as symbols in regular expressions =>
// replace them with english month names
for (j=0; j<month_names.length; j++) {
var re = new RegExp(month_names[j], 'gi');
str = str.replace(re, en_month_names[j]);
}
for (j=0; j<short_month_names.length; j++) {
var re = new RegExp(short_month_names[j], 'gi');
str = str.replace(re, en_short_month_names[j]);
}
var p = String(str).split(/\W+/g);
var f_p = String(format).match(/%./g);
var i;
var j;
var k;
//alert(p + ' => ' + f_p);
for (i=0; i<f_p.length; i++) {
if (!p[i]) continue;
switch (f_p[i]) {
case '%a': // am pm
case '%A':
if (/am/i.test(p[i]) && hours >= 12) {
hours -= 12;
} else {
if (/pm/i.test(p[i]) && hours < 12) {
hours += 12;
}
}
break;
case '%d':
case '%j':
day = parseInt(Number(p[i]));
break;
case '%F':
for (j=0; j<en_month_names.length; j++) {
if (en_month_names[j].toLowerCase() == p[i].toLowerCase()) {
month = j;
break;
}
}
break;
case '%h':
case '%H':
case '%g':
case '%G':
hours = parseInt(Number(p[i]));
// to recognize this: 10pm
if (/am/i.test(p[i]) && hours >= 12) {
hours -= 12;
} else {
if (/pm/i.test(p[i]) && hours < 12) {
hours += 12;
}
}
break;
case '%i':
mins = parseInt(Number(p[i]));
break;
case '%m':
case '%n':
month = parseInt(Number(p[i]))-1;
break;
case '%M':
for (j=0; j<en_short_month_names.length; j++) {
if (en_short_month_names[j].toLowerCase() == p[i].toLowerCase()) {
month = j;
break;
}
}
break;
case '%s':
seconds = parseInt(Number(p[i]));
break;
case '%Y':
year = parseInt(Number(p[i]));
break;
case '%y':
year = parseInt(p[i]);
if (year < 100) {
year += year + (year > 29 ? 1900 : 2000);
}
break;
default:
break;
}
}
if (isNaN(year) || year <= 0) year = today.getFullYear();
if (isNaN(month) || month < 0 || month > 11) month = today.getMonth();
if (isNaN(day) || day <= 0 || day > 31) day = today.getDate();
if (isNaN(hours) || hours < 0 || hours > 23) hours = today.getHours();
if (isNaN(mins) || mins < 0 || mins > 59) mins = today.getMinutes();
if (isNaN(seconds) || seconds < 0 || seconds > 59) seconds = today.getSeconds();
//alert(year + ' => ' + month + ' => ' + day + ' => ' + hours + ' => ' + mins + ' => ' + seconds);
this.date = new Date(year, month, day, hours, mins, seconds);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -