Brak opisu

date.js 8.4KB

    $.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); } }; } }); });