(function($) { $.fn.datetimemask = function(settings) { var options = { safemodel: true, masktype: "3", isnull: false, lawlessmessage: "你输入的格式错误", onlycontrolkeydown: false, focuscssname: "", oldclassname: "", isnow: false, ismonthstart: false, whenfocus: function() { }, whenblur: function() { return true; } }; settings = settings || {}; $.extend(options, settings); return this.each(function() { if (options.isnow || options.ismonthstart) this.value = $.datetimemask.getdatetime(options); $(this).attr("autocomplete", "off"); if (options.safemodel) { if ($.browser.msie) { this.ondragenter = function() { return false; }; this.onpaste = function() { return false; }; } } $(this).keydown(function(event) { $.datetimemask.keydown(this, event, options); }) if (!options.onlycontrolkeydown) { $(this).focus(function() { $.datetimemask.setfocus(this, options); options.whenfocus(); }); $(this).blur(function() { if (!$.datetimemask.lostfocus(this, options)) { if (!options.whenblur(this.value)) this.value = this.oldvalue; } }); } }); }; $.datetimemask = { setfocus: function(obj, options) { obj.oldvalue = obj.value; if (obj.focuscssname && obj.focuscssname != "") { obj.oldclassname = obj.classname; obj.classname = obj.focuscssname; } }, lostfocus: function(obj, options) { var ls_date, ls_time; var lb_error = false; switch (options.masktype) { case "1": ls_date = obj.value.substr(0, 10); ls_time = obj.value.substr(11); if (obj.value == "0000-00-00 00:00:00") { if (!options.isnull) lb_error = true; } else { if (!($.datetimemask.isvaliddate(ls_date) && $.datetimemask.isvalidtime(ls_time))) lb_error = true; } break; case "2": ls_date = obj.value.substr(0, 10); ls_time = obj.value.substr(11) + ":00"; if (obj.value == "0000-00-00 00:00") { if (!options.isnull) lb_error = true; } else { if (!($.datetimemask.isvaliddate(ls_date) && $.datetimemask.isvalidtime(ls_time))) lb_error = true; } break; case "3": ls_date = obj.value; if (ls_date == "0000-00-00") { if (!options.isnull) lb_error = true; } else { if (!$.datetimemask.isvaliddate(ls_date)) lb_error = true; } break; case "4": ls_time = obj.value + ":00"; ; if (obj.value == "00:00") { if (!options.isnull) lb_error = true; } else { if (!$.datetimemask.isvalidtime(ls_time)) lb_error = true; } break; case "5": ls_time = obj.value; if (ls_time == "00:00:00") { if (!options.isnull) lb_error = true; } else { if (!$.datetimemask.isvalidtime(ls_time)) lb_error = true; } break; } if (lb_error) { if (!options.lawlessmessage || options.lawlessmessage != "") alert(options.lawlessmessage); obj.value = obj.oldvalue; } if (obj.focuscssname && obj.focuscssname != "") obj.classname = obj.oldclassname; return lb_error; }, keydown: function(objtextbox, event, options) { var key = { backspace: 8, tab: 9, enter: 13, end: 35, home: 36, left: 37, rigth: 39, del: 46 }; var nkeycode = event.keycode; switch (nkeycode) { case key.tab: case key.home: case key.end: case key.left: case key.rigth: return; case key.enter: event.preventdefault(); if (options.entermovetonext) event.keycode = 9; return; } if (objtextbox.readonly) { event.returnvalue = false; return; } var strtext = objtextbox.value; var ntextlen = strtext.length; var ncursorpos = $.datetimemask.getcursor(objtextbox).start; event.returnvalue = false; event.preventdefault(); switch (nkeycode) { case key.backspace: if (ncursorpos > 0) { fronttext = strtext.substr(ncursorpos - 1, 1); if (fronttext != "-" && fronttext != ":" && fronttext != " ") { fronttext = "0"; strtext = strtext.substr(0, ncursorpos - 1) + fronttext + strtext.substr(ncursorpos, ntextlen - ncursorpos); } ncursorpos--; } break; case key.del: if (ncursorpos < ntextlen) { behindtext = strtext.substr(ncursorpos, 1); if (behindtext != "-" && behindtext != ":" && behindtext != " ") behindtext = "0"; if (ncursorpos + 1 == ntextlen) strtext = strtext.substr(0, ncursorpos) + behindtext; else strtext = strtext.substr(0, ncursorpos) + behindtext + strtext.substr(ncursorpos + 1, ntextlen - ncursorpos - 1); ncursorpos++; } break; default: if (ncursorpos == ntextlen) break; if (!(nkeycode >= 48 && nkeycode <= 57 || nkeycode >= 96 && nkeycode <= 105)) break; if (nkeycode > 95) nkeycode -= (95 - 47); behindtext = strtext.substr(ncursorpos, 1); if (behindtext != "-" && behindtext != ":" && behindtext != " ") { var keycode = string.fromcharcode(nkeycode); pretext = strtext.substr(0, ncursorpos) + keycode + strtext.substr(ncursorpos + 1, ntextlen); if (!$.datetimemask.dealwith(options.masktype, pretext, ncursorpos)) break; strtext = pretext; ncursorpos++; } if (ncursorpos > strtext.length) { ncursorpos = strtext.length; } if (options.masktype <= "3") { if (ncursorpos == 4 || ncursorpos == 7 || ncursorpos == 10 || ncursorpos == 13 || ncursorpos == 16) ncursorpos++; } else { if (ncursorpos == 2 || ncursorpos == 5) ncursorpos++; } break; } objtextbox.value = strtext; $.datetimemask.selection(objtextbox, ncursorpos, ncursorpos); }, dealwith: function(masktype, input, ncursorpos) { var ls_date, ls_time; if (masktype <= "3") { ls_year = input.substr(0, 4); if (ls_year == "0000") ls_year = "2001"; ls_month = input.substr(5, 2); if (ls_month == "00") ls_month = "01"; ls_day = input.substr(8, 2); if (ls_day == "00") ls_day = "01"; ls_date = ls_year + "-" + ls_month + "-" + ls_day; ls_time = "00:00:00"; if (masktype == "1") { ls_time = input.substr(11); } else { if (masktype == "2") ls_time = input.substr(11) + ":00"; } return (ncursorpos <= 10 ? $.datetimemask.isvaliddate(ls_date) : $.datetimemask.isvalidtime(ls_time)) } else { ls_time = input; if (masktype == "4") ls_time = ls_time + ":00"; return $.datetimemask.isvalidtime(ls_time); } return true; }, getcursor: function(textbox) { var obj = new object(); var start = 0, end = 0; if ($.browser.mozilla) { start = textbox.selectionstart; end = textbox.selectionend; } if ($.browser.msie) { var range = textbox.createtextrange(); var text = range.text; var selrange = document.selection.createrange(); var seltext = selrange.text; while (selrange.compareendpoints("starttostart", range) > 0) { selrange.movestart("character", -1); start++; } while (selrange.compareendpoints("endtostart", range) > 0) { selrange.moveend("character", -1); end++; } } obj.start = start; obj.end = end; return obj; }, selection: function(field, start, end) { if (field.createtextrange) { var r = field.createtextrange(); r.movestart('character', start); r.collapse(true); r.select(); } else if (field.setselectionrange) { field.setselectionrange(start, end); } else { if (field.selectionstart) { field.selectionstart = start; field.selectionend = end; } } field.focus(); }, isvaliddate: function(strdate) { var ls_regex = "^((((((0[48])|([13579][26])|([2468][048]))00)|([0-9][0-9]((0[48])|([13579][26])|([2468][048]))))-02-29)|(((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9][0-9])|([1-9][0-9][0-9][0-9]))-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8]))))))$"; var exp = new regexp(ls_regex, "i"); return exp.test(strdate); }, isvalidtime: function(strtime) { var a = strtime.match(/^(\d{2,2})(:)?(\d{2,2})\2(\d{2,2})$/); if (!a || a[1] > 23 || a[3] > 59 || a[4] > 59) return false; return true; }, getdatetime: function(options) { var d = new date(); var vyear = d.getfullyear(); var vmon = d.getmonth() + 1; vmon = (vmon < 10 ? "0" + vmon : vmon); var vday = d.getdate(); var ls_date = vyear + "-" + vmon + "-" + (vday < 10 ? "0" + vday : vday); var vhour = d.gethours(); var vmin = d.getminutes(); var vsec = d.getseconds(); var ls_time = (vhour < 10 ? "0" + vhour : vhour) + ":" + (vmin < 10 ? "0" + vmin : vmin) + ":" + (vsec < 10 ? "0" + vsec : vsec); switch (options.masktype) { case "1": return options.isnow ? (ls_date + " " + ls_time) : (vyear + "-" + vmon + "-" + "01 00:00:00"); case "2": return options.isnow ? (ls_date + " " + ls_time.substr(0, 5)) : (vyear + "-" + vmon + "-" + "01 00:00"); case "3": return options.isnow ? ls_date : (vyear + "-" + vmon + "-" + "01"); case "4": return ls_time.substr(0, 5); case "5": return ls_time; } } } })(jquery);