123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- $.use(["jQuery", "form", "doc", "util", "dropdown"], function($, form, doc, util, dd) {
- var m_rd = "必选的",
- readOnly = "readOnly",
- dd_ctn = "dd-ctn",
- dd_clean = "dd-clean",
- showOnly = "showOnly",
- modelName = 'date',
- def = "defVal",
- placeholder = "placeholder",
- required = "required",
- date_year = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
- date_leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
- date_isleap = function(y) {
- return(y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
- },
- date_validDate = function(v) {
- if(v.length != 8) return false;
- for(var i = 0; i < 8; ++i) {
- var c = v.charAt(i);
- if(c > '9' || c < '0') return false;
- }
- var m = parseInt(v.substring(4, 6)) - 1;
- if(m < 0 || m > 11) return false;
- var d = parseInt(v.substring(6, 8));
- var ym = date_isleap(parseInt(v.substring(0, 4))) ? date_leapYear : date_year;
- if(d < 1 || d > ym[m]) return false;
- return true;
- },
- date_fmt = function(v) {
- return(v > 9 ? "" : "0") + v;
- },
- date_MS_IN_DAY = 24 * 60 * 60 * 1000,
- date_incDay = function(d) {
- return new Date(d.getTime() + date_MS_IN_DAY);
- },
- date_decDay = function(d) {
- return new Date(d.getTime() - date_MS_IN_DAY);
- },
- date_dayFmt = function(d) {
- return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate());
- },
- date_now = function() {
- var d = new Date();
- return "" + d.getFullYear() + date_fmt(d.getMonth() + 1) + date_fmt(d.getDate()) + date_fmt(d.getHours()) + date_fmt(d.getMinutes()) + date_fmt(d.getSeconds());
- },
- table_year = { an: "year", av: "" },
- table_month = { an: "month", av: "" },
- daySwitch = [""],
- thead = {
- tn: "thead",
- chs: [{
- tn: "tr",
- chs: [
- { tn: "th", attrs: [{ an: "class", av: "prev-year" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-arrow-left" }] }] },
- { tn: "th", attrs: [{ an: "class", av: "prev-month" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-chevron-left" }] }] },
- { tn: "th", attrs: [{ an: "class", av: "switch" }, { an: "colspan", av: "3" }], chs: daySwitch },
- { tn: "th", attrs: [{ an: "class", av: "next-month" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-chevron-right" }] }] },
- { tn: "th", attrs: [{ an: "class", av: "next-year" }], chs: [{ tn: "i", attrs: [{ an: "class", av: "icon-arrow-right" }] }] }
- ]
- }, {
- tn: "tr",
- chs: [
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["日"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["一"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["二"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["三"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["四"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["五"] },
- { tn: "th", attrs: [{ an: "class", av: "dow" }], chs: ["六"] },
- ]
- }]
- },
- tbody = { tn: "tbody" },
- tfoot = { tn: "tfoot" },
- table = { tn: "table", attrs: [{ an: "class", av: "day" }, table_year, table_month], chs: [thead, tbody, tfoot] },
- date_drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop date" }], chs: [table] },
- show_day = function($e, y, m) {
- table_year.av = "" + y;
- table_month.av = "" + (m + 1);
- daySwitch[0] = date_fmt(m + 1) + "月 " + y + "年";
- var dd = new Date();
- dd.setFullYear(y);
- dd.setMonth(m);
- dd.setDate(1);
- var dayInWeek = dd.getDay();
- tbody.chs = [];
- var weekDays = { tn: "tr" };
- var days = weekDays.chs = [];
- for(var i = 0; i < dayInWeek; ++i) {
- var cd = date_dayFmt(new Date(dd.getTime() - ((dayInWeek - i) * date_MS_IN_DAY)));
- days.push({ tn: "td", attrs: [{ an: "class", av: "no-current-month" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
- }
- var ld = date_isleap(y) ? date_leapYear[m] : date_year[m];
- for(var i = 0; i < ld; ++i) {
- var cd = date_dayFmt(dd);
- days.push({ tn: "td", attrs: [{ an: "class", av: "day-item" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
- if(dd.getDay() == 6) {
- tbody.chs.push(weekDays);
- weekDays = { tn: "tr" };
- days = weekDays.chs = [];
- }
- dd = date_incDay(dd);
- }
- dayInWeek = dd.getDay();
- if(dayInWeek) {
- for(var i = dayInWeek; i < 7; ++i) {
- var cd = date_dayFmt(dd);
- days.push({ tn: "td", attrs: [{ an: "class", av: "no-current-month" }, { an: "day", av: "" + cd }], chs: [cd.substring(6, 8)] });
- dd = date_incDay(dd);
- }
- tbody.chs.push(weekDays);
- }
- $e.find(".dd-drop").remove();
- util.appendChild($e[0], date_drop);
- },
- handCode = { an: "code", av: "" },
- pa = [""],
- jhref = { an: "href", av: "javascript:;" },
- dd_hand = { an: "class", av: "dd-hand" },
- icon_drop = { tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
- icon_close = { tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
- a_placeHolder = { tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa },
- hand = {
- tn: "a",
- attrs: [
- dd_hand,
- jhref,
- handCode,
- ],
- chs: [
- icon_drop,
- { tn: "span" },
- icon_close,
- a_placeHolder,
- ]
- };
- form.register(function($e) {
- var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, required]),
- rv;
- if(cls[modelName]) {
- var n = $e.attr("name") || $e.attr("id"),
- rules = [];
- if(!n) {
- throw "Attribute[name] is invalid";
- }
- var dv = $e.attr(def) || "";
- $e.empty().addClass(dd_ctn).addClass(dd_clean);
- pa[0] = $e.attr(placeholder) || "请选择日期......";
- util.appendChild($e[0], hand);
- var $h = $e.children("a");
- var $span = $h.children("span");
- var date_change = function(val) {
- if(val) {
- if(val == "current") {
- val = date_now().substr(0, 8);
- }
- var dt = val.substring(0, 4) + "-" + val.substring(4, 6) + "-" + val.substring(6, 8);
- if(rv !== val) {
- $h.attr("code", val);
- $span.text(dt);
- rv = val;
- }
- } else {
- rv = "";
- $h.attr("code", "");
- $span.text("");
- }
- };
- date_change(dv);
- if(!(cls[readOnly] || cls[showOnly])) {
- $e.on("shown.dropdown", function(evt) {
- var dp_chs = [];
- var n = date_now();
- var val = rv ? (date_validDate(rv) ? rv : n) : n;
- show_day($e, parseInt(val.substring(0, 4)), parseInt(val.substring(4, 6)) - 1);
- });
- $e.find(".icon-close").on("click", function(evt) {
- date_change("");
- $e.addClass("dd-hold-once");
- });
- $e.on("click", ".day .day-item , .day .no-current-month", function() {
- date_change(this.getAttribute("day"));
- });
- $e.on("click", ".day .prev-year", function(e) {
- var date_tb = $e.find("table"),
- yv = parseInt(date_tb.attr("year")) - 1,
- mv = parseInt(date_tb.attr("month")) - 1;
- $e.addClass("dd-hold-once");
- show_day($e, yv, mv);
- });
- $e.on("click", ".day .prev-month", function(e) {
- var date_tb = $e.find("table"),
- yv = parseInt(date_tb.attr("year")),
- mv = parseInt(date_tb.attr("month")) - 2;
- if(0 > mv) {
- yv -= 1;
- mv = 11
- }
- $e.addClass("dd-hold-once");
- show_day($e, yv, mv);
- });
- $e.on("click", ".day .next-year", function(e) {
- var date_tb = $e.find("table"),
- yv = parseInt(date_tb.attr("year")) + 1,
- mv = parseInt(date_tb.attr("month")) - 1;
- $e.addClass("dd-hold-once");
- show_day($e, yv, mv);
- });
- $e.on("click", ".day .next-month", function(e) {
- var date_tb = $e.find("table"),
- yv = parseInt(date_tb.attr("year")),
- mv = parseInt(date_tb.attr("month"));
- if(mv === 12) {
- yv += 1;
- mv = 0
- }
- $e.addClass("dd-hold-once");
- show_day($e, yv, mv);
- });
- }
- return {
- name: n,
- get: function() {
- return rv ? rv : undefined;
- },
- set: function(data) {
- date_change(data ? data : "");
- },
- validate: function() {
- if(cls[required]) {
- if(!rv) {
- this.invalid(m_rd);
- return m_rd;
- }
- }
- return util.validate(rules, this);
- },
- addRules: function(rule) {
- util.addRules(rules, rule);
- },
- reset: function() {
- this.set(dv);
- },
- valid: function() { util.valid($e); },
- invalid: function(reson) {
- util.invalid($e);
- util.error(reson);
- }
- };
- }
- });
- });
|