📄 calendar.js
字号:
CSS_CELL_RIGHT : "calcellright",
CSS_CELL_BOTTOM : "calcellbottom",
CSS_CELL_HOVER : "calcellhover",
CSS_CELL_HIGHLIGHT1 : "highlight1",
CSS_CELL_HIGHLIGHT2 : "highlight2",
CSS_CELL_HIGHLIGHT3 : "highlight3",
CSS_CELL_HIGHLIGHT4 : "highlight4"
};
this.Style = this.Config.Style;
this.Config.Locale = {
// Locale definition
MONTHS_SHORT : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
MONTHS_LONG : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
WEEKDAYS_1CHAR : ["S", "M", "T", "W", "T", "F", "S"],
WEEKDAYS_SHORT : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
WEEKDAYS_MEDIUM : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
WEEKDAYS_LONG : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
DATE_DELIMITER : ",",
DATE_FIELD_DELIMITER : "/",
DATE_RANGE_DELIMITER : "-",
MY_MONTH_POSITION : 1,
MY_YEAR_POSITION : 2,
MD_MONTH_POSITION : 1,
MD_DAY_POSITION : 2,
MDY_MONTH_POSITION : 1,
MDY_DAY_POSITION : 2,
MDY_YEAR_POSITION : 3
};
this.Locale = this.Config.Locale;
this.Config.Options = {
// Configuration variables
MULTI_SELECT : false,
SHOW_WEEKDAYS : true,
START_WEEKDAY : 0,
SHOW_WEEK_HEADER : false,
SHOW_WEEK_FOOTER : false,
HIDE_BLANK_WEEKS : false,
NAV_ARROW_LEFT : YAHOO.widget.Calendar_Core.IMG_ROOT + "us/tr/callt.gif",
NAV_ARROW_RIGHT : YAHOO.widget.Calendar_Core.IMG_ROOT + "us/tr/calrt.gif"
};
this.Options = this.Config.Options;
this.customConfig();
if (! this.Options.LOCALE_MONTHS) {
this.Options.LOCALE_MONTHS=this.Locale.MONTHS_LONG;
}
if (! this.Options.LOCALE_WEEKDAYS) {
this.Options.LOCALE_WEEKDAYS=this.Locale.WEEKDAYS_SHORT;
}
// If true, reconfigure weekday arrays to place Mondays first
if (this.Options.START_WEEKDAY > 0) {
for (var w=0;w<this.Options.START_WEEKDAY;++w) {
this.Locale.WEEKDAYS_SHORT.push(this.Locale.WEEKDAYS_SHORT.shift());
this.Locale.WEEKDAYS_MEDIUM.push(this.Locale.WEEKDAYS_MEDIUM.shift());
this.Locale.WEEKDAYS_LONG.push(this.Locale.WEEKDAYS_LONG.shift());
}
}
};
/**
* This method is called when subclasses need to override configuration variables
* or create new ones. Values can be explicitly set as follows:
* <blockquote><code>
* this.Config.Style.CSS_CELL = "newcalcell";
* this.Config.Locale.MONTHS_SHORT = ["Jan", "Fv", "Mars", "Avr", "Mai", "Juin", "Juil", "Aot", "Sept", "Oct", "Nov", "Dc"];
* </code></blockquote>
*/
YAHOO.widget.Calendar_Core.prototype.customConfig = function() { };
/**
* Builds the date label that will be displayed in the calendar header or
* footer, depending on configuration.
* @return The formatted calendar month label
* @type String
*/
YAHOO.widget.Calendar_Core.prototype.buildMonthLabel = function() {
var text = this.Options.LOCALE_MONTHS[this.pageDate.getMonth()] + " " + this.pageDate.getFullYear();
return text;
};
/**
* Builds the date digit that will be displayed in calendar cells
* @return The formatted day label
* @type String
*/
YAHOO.widget.Calendar_Core.prototype.buildDayLabel = function(workingDate) {
var day = workingDate.getDate();
return day;
};
/**
* Builds the calendar table shell that will be filled in with dates and formatting.
* This method calls buildShellHeader, buildShellBody, and buildShellFooter (in that order)
* to construct the pieces of the calendar table. The construction of the shell should
* only happen one time when the calendar is initialized.
*/
YAHOO.widget.Calendar_Core.prototype.buildShell = function() {
this.table = document.createElement("TABLE");
this.table.cellSpacing = 0;
YAHOO.widget.Calendar_Core.setCssClasses(this.table, [this.Style.CSS_CALENDAR]);
this.table.id = this.id;
this.buildShellHeader();
this.buildShellBody();
this.buildShellFooter();
YAHOO.util.Event.addListener(window, "unload", this._unload, this);
};
/**
* Builds the calendar shell header by inserting a THEAD into the local calendar table.
*/
YAHOO.widget.Calendar_Core.prototype.buildShellHeader = function() {
var head = document.createElement("THEAD");
var headRow = document.createElement("TR");
var headerCell = document.createElement("TH");
var colSpan = 7;
if (this.Config.Options.SHOW_WEEK_HEADER) {
this.weekHeaderCells = new Array();
colSpan += 1;
}
if (this.Config.Options.SHOW_WEEK_FOOTER) {
this.weekFooterCells = new Array();
colSpan += 1;
}
headerCell.colSpan = colSpan;
YAHOO.widget.Calendar_Core.setCssClasses(headerCell,[this.Style.CSS_HEADER_TEXT]);
this.headerCell = headerCell;
headRow.appendChild(headerCell);
head.appendChild(headRow);
// Append day labels, if needed
if (this.Options.SHOW_WEEKDAYS) {
var row = document.createElement("TR");
var fillerCell;
YAHOO.widget.Calendar_Core.setCssClasses(row,[this.Style.CSS_WEEKDAY_ROW]);
if (this.Config.Options.SHOW_WEEK_HEADER) {
fillerCell = document.createElement("TH");
YAHOO.widget.Calendar_Core.setCssClasses(fillerCell,[this.Style.CSS_WEEKDAY_CELL]);
row.appendChild(fillerCell);
}
for(var i=0;i<this.Options.LOCALE_WEEKDAYS.length;++i) {
var cell = document.createElement("TH");
YAHOO.widget.Calendar_Core.setCssClasses(cell,[this.Style.CSS_WEEKDAY_CELL]);
cell.innerHTML=this.Options.LOCALE_WEEKDAYS[i];
row.appendChild(cell);
}
if (this.Config.Options.SHOW_WEEK_FOOTER) {
fillerCell = document.createElement("TH");
YAHOO.widget.Calendar_Core.setCssClasses(fillerCell,[this.Style.CSS_WEEKDAY_CELL]);
row.appendChild(fillerCell);
}
head.appendChild(row);
}
this.table.appendChild(head);
};
/**
* Builds the calendar shell body (6 weeks by 7 days)
*/
YAHOO.widget.Calendar_Core.prototype.buildShellBody = function() {
// This should only get executed once
this.tbody = document.createElement("TBODY");
for (var r=0;r<6;++r) {
var row = document.createElement("TR");
for (var c=0;c<this.headerCell.colSpan;++c) {
var cell;
if (this.Config.Options.SHOW_WEEK_HEADER && c===0) { // Row header
cell = document.createElement("TH");
this.weekHeaderCells[this.weekHeaderCells.length] = cell;
} else if (this.Config.Options.SHOW_WEEK_FOOTER && c==(this.headerCell.colSpan-1)){ // Row footer
cell = document.createElement("TH");
this.weekFooterCells[this.weekFooterCells.length] = cell;
} else {
cell = document.createElement("TD");
this.cells[this.cells.length] = cell;
YAHOO.widget.Calendar_Core.setCssClasses(cell, [this.Style.CSS_CELL]);
YAHOO.util.Event.addListener(cell, "click", this.doSelectCell, this);
YAHOO.util.Event.addListener(cell, "mouseover", this.doCellMouseOver, this);
YAHOO.util.Event.addListener(cell, "mouseout", this.doCellMouseOut, this);
}
row.appendChild(cell);
}
this.tbody.appendChild(row);
}
this.table.appendChild(this.tbody);
};
/**
* Builds the calendar shell footer. In the default implementation, there is
* no footer.
*/
YAHOO.widget.Calendar_Core.prototype.buildShellFooter = function() { };
/**
* Outputs the calendar shell to the DOM, inserting it into the placeholder element.
*/
YAHOO.widget.Calendar_Core.prototype.renderShell = function() {
this.oDomContainer.appendChild(this.table);
this.shellRendered = true;
};
/**
* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute
* when the method is called: renderHeader, renderBody, renderFooter.
* Refer to the documentation for those methods for information on
* individual render tasks.
*/
YAHOO.widget.Calendar_Core.prototype.render = function() {
if (! this.shellRendered) {
this.buildShell();
this.renderShell();
}
this.resetRenderers();
this.cellDates.length = 0;
// Find starting day of the current month
var workingDate = YAHOO.widget.DateMath.findMonthStart(this.pageDate);
this.renderHeader();
this.renderBody(workingDate);
this.renderFooter();
this.onRender();
};
/**
* Appends the header contents into the widget header.
*/
YAHOO.widget.Calendar_Core.prototype.renderHeader = function() {
this.headerCell.innerHTML = "";
var headerContainer = document.createElement("DIV");
headerContainer.className = this.Style.CSS_HEADER;
headerContainer.appendChild(document.createTextNode(this.buildMonthLabel()));
this.headerCell.appendChild(headerContainer);
};
/**
* Appends the calendar body. The default implementation calculates the number of
* OOM (out of month) cells that need to be rendered at the start of the month, renders those,
* and renders all the day cells using the built-in cell rendering methods.
*
* While iterating through all of the cells, the calendar checks for renderers in the
* local render stack that match the date of the current cell, and then applies styles
* as necessary.
*
* @param {Date} workingDate The current working Date object being used to generate the calendar
*/
YAHOO.widget.Calendar_Core.prototype.renderBody = function(workingDate) {
this.preMonthDays = workingDate.getDay();
if (this.Options.START_WEEKDAY > 0) {
this.preMonthDays -= this.Options.START_WEEKDAY;
}
if (this.preMonthDays < 0) {
this.preMonthDays += 7;
}
this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate();
this.postMonthDays = YAHOO.widget.Calendar_Core.DISPLAY_DAYS-this.preMonthDays-this.monthDays;
workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays);
var weekRowIndex = 0;
for (var c=0;c<this.cells.length;++c) {
var cellRenderers = new Array();
var cell = this.cells[c];
this.clearElement(cell);
cell.index = c;
cell.id = this.id + "_cell" + c;
this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates
if (workingDate.getDay() == this.Options.START_WEEKDAY) {
var rowHeaderCell = null;
var rowFooterCell = null;
if (this.Options.SHOW_WEEK_HEADER) {
rowHeaderCell = this.weekHeaderCells[weekRowIndex];
this.clearElement(rowHeaderCell);
}
if (this.Options.SHOW_WEEK_FOOTER) {
rowFooterCell = this.weekFooterCells[weekRowIndex];
this.clearElement(rowFooterCell);
}
if (this.Options.HIDE_BLANK_WEEKS && this.isDateOOM(workingDate) && ! YAHOO.widget.DateMath.isMonthOverlapWeek(workingDate)) {
// The first day of the week is not in this month, and it's not an overlap week
continue;
} else {
if (rowHeaderCell) {
this.renderRowHeader(workingDate, rowHeaderCell);
}
if (rowFooterCell) {
this.renderRowFooter(workingDate, rowFooterCell);
}
}
}
var renderer = null;
if (workingDate.getFullYear() == this.today.getFullYear() &&
workingDate.getMonth() == this.today.getMonth() &&
workingDate.getDate() == this.today.getDate()) {
cellRenderers[cellRenderers.length]=this.renderCellStyleToday;
}
if (this.isDateOOM(workingDate)) {
cellRenderers[cellRenderers.length]=this.renderCellNotThisMonth;
} else {
for (var r=0;r<this.renderStack.length;++r) {
var rArray = this.renderStack[r];
var type = rArray[0];
var month;
var day;
var year;
switch (type) {
case YAHOO.widget.Calendar_Core.DATE:
month = rArray[1][1];
day = rArray[1][2];
year = rArray[1][0];
if (workingDate.getMonth()+1 == month && workingDate.getDate() == day && workingDate.getFullYear() == year) {
renderer = rArray[2];
this.renderStack.splice(r,1);
}
break;
case YAHOO.widget.Calendar_Core.MONTH_DAY:
month = rArray[1][0];
day = rArray[1][1];
if (workingDate.getMonth()+1 == month && workingDate.getDate() == day) {
renderer = rArray[2];
this.renderStack.splice(r,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -