jquery.jedate.js 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559
  1. /**
  2. @Name : jeDate v6.0.2 日期控件
  3. @Author: chen guojun
  4. @Date: 2017-11-02
  5. @QQ群:516754269
  6. @官网:http://www.jemui.com/ 或 https://github.com/singod/jeDate
  7. */
  8. ;(function(root, factory) {
  9. //amd
  10. if (typeof define === 'function' && define.amd) {
  11. define(['jquery'], factory);
  12. } else if (typeof exports === 'object') { //umd
  13. module.exports = factory();
  14. } else {
  15. root.jeDate = factory();
  16. }
  17. })(this, function() {
  18. // 验证是否引用jquery
  19. if (!$ || !$.fn || !$.fn.jquery) {
  20. alert('在引用jquery.jedate.js之前,先引用jQuery,否则无法使用 jeDate');
  21. return;
  22. }
  23. var jet = {}, doc = document, regymdzz = "YYYY|MM|DD|hh|mm|ss|zz", gr = /\-/g,
  24. regymd = "YYYY|MM|DD|hh|mm|ss|zz".replace("|zz",""),
  25. parseInt = function (n) { return window.parseInt(n, 10);},
  26. config = {
  27. skinCell:"jedateblue",
  28. language:{
  29. name : "cn",
  30. month : ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"],
  31. weeks : [ "日", "一", "二", "三", "四", "五", "六" ],
  32. times : ["小时","分钟","秒数"],
  33. titText: "请选择日期时间",
  34. clear : "清空",
  35. today : "现在",
  36. yes : "确定",
  37. close : "关闭"
  38. },
  39. range:false,
  40. trigger:"click",
  41. format:"YYYY-MM-DD hh:mm:ss", //日期格式
  42. minDate:"1900-01-01 00:00:00", //最小日期
  43. maxDate:"2099-12-31 23:59:59" //最大日期
  44. };
  45. $.fn.jeDate = function(options){
  46. return new jeDate($(this),options||{});
  47. };
  48. $.extend({
  49. jeDate:function(elem, options){
  50. return new jeDate($(elem),options||{});
  51. }
  52. });
  53. jet.isObj = function (obj){
  54. for(var i in obj){return true;}
  55. return false;
  56. };
  57. jet.reMatch = function (str) {
  58. return str.match(/\w+|d+/g);
  59. };
  60. jet.docScroll = function(type) {
  61. type = type ? "scrollLeft" :"scrollTop";
  62. return document.body[type] | document.documentElement[type];
  63. };
  64. jet.docArea = function(type) {
  65. return document.documentElement[type ? "clientWidth" :"clientHeight"];
  66. };
  67. //判断是否闰年
  68. jet.isLeap = function(y) {
  69. return (y % 100 !== 0 && y % 4 === 0) || (y % 400 === 0);
  70. };
  71. //补齐数位
  72. jet.digit = function(num) {
  73. return num < 10 ? "0" + (num | 0) :num;
  74. };
  75. //判断是否为数字
  76. jet.isNum = function(value){
  77. return /^[+-]?\d*\.?\d*$/.test(value) ? true : false;
  78. };
  79. //获取本月的总天数
  80. jet.getDaysNum = function(y, m) {
  81. var num = 31;
  82. switch (parseInt(m)) {
  83. case 2: num = jet.isLeap(y) ? 29 : 28; break;
  84. case 4: case 6: case 9: case 11: num = 30; break;
  85. }
  86. return num;
  87. };
  88. //获取月与年
  89. jet.getYM = function(y, m, n) {
  90. var nd = new Date(y, m - 1);
  91. nd.setMonth(m - 1 + n);
  92. return {
  93. y: nd.getFullYear(),
  94. m: nd.getMonth() + 1
  95. };
  96. };
  97. //获取上个月
  98. jet.prevMonth = function(y, m, n) {
  99. return jet.getYM(y, m, 0 - (n || 1));
  100. };
  101. //获取下个月
  102. jet.nextMonth = function(y, m, n) {
  103. return jet.getYM(y, m, n || 1);
  104. };
  105. //转换日期格式
  106. jet.parse = function(ymdhms, format) {
  107. return format.replace(new RegExp(regymdzz,"g"), function(str, index) {
  108. return str == "zz" ? "00":jet.digit(ymdhms[str]);
  109. });
  110. };
  111. jet.isparmat = function(format) {
  112. var remat = jet.reMatch(format), mat = regymdzz.split("|"), tmpArr = [];
  113. $.each(mat,function (m,mval) {
  114. $.each(remat,function (r,rval) {
  115. if (mval == rval) tmpArr.push(rval);
  116. });
  117. });
  118. return tmpArr.join("-");
  119. };
  120. jet.parseOld = function(ymd, hms, format) {
  121. ymd = ymd.concat(hms);
  122. var ymdObj = {}, mat = regymdzz.split("|"),
  123. remat = jet.reMatch(format);
  124. $.each(ymd,function (i,val) {
  125. ymdObj[remat[i]] = parseInt(val);
  126. });
  127. return format.replace(new RegExp(regymdzz,"g"), function(str, index) {
  128. return str == "zz" ? "00":jet.digit(ymdObj[str]);
  129. });
  130. };
  131. //验证日期格式
  132. jet.checkFormat = function(format) {
  133. var ymdhms = [];
  134. format.replace(new RegExp(regymdzz,"g"), function(str, index) {
  135. ymdhms.push(str);
  136. });
  137. return ymdhms.join("-");
  138. };
  139. jet.splMatch = function(str) {
  140. var timeArr = str.split(" ");
  141. return jet.reMatch(timeArr[0]);
  142. };
  143. jet.mlen = function (format) {
  144. var matlen = format.match(/\w+|d+/g).length,
  145. mathh = (format.substring(0, 2) == "hh"),
  146. lens = mathh&&matlen<=3 ? 7 : matlen;
  147. return lens;
  148. };
  149. //验证日期
  150. jet.checkDate = function (date) {
  151. var dateArr = jet.reMatch(date);
  152. if (isNaN(dateArr[0]) || isNaN(dateArr[1]) || isNaN(dateArr[2])) return false;
  153. if (dateArr[1] > 12 || dateArr[1] < 1) return false;
  154. if (dateArr[2] < 1 || dateArr[2] > 31) return false;
  155. if ((dateArr[1] == 4 || dateArr[1] == 6 || dateArr[1] == 9 || dateArr[1] == 11) && dateArr[2] > 30) return false;
  156. if (dateArr[1] == 2) {
  157. if (dateArr[2] > 29) return false;
  158. if ((dateArr[0] % 100 == 0 && dateArr[0] % 400 != 0 || dateArr[0] % 4 != 0) && dateArr[2] > 28) return false;
  159. }
  160. return true;
  161. };
  162. //返回日期
  163. function DateTime() {
  164. var ND = new Date(), that = this;
  165. //返回一个数值相同的新GetDateTime对象
  166. that.reDate = function () {
  167. return new DateTime();
  168. };
  169. //返回此实例的Date值
  170. that.GetValue = function () {
  171. return ND;
  172. };
  173. //获取此实例所表示日期的年份部分。
  174. that.GetFullYear = function () {
  175. return ND.getFullYear();
  176. };
  177. //获取此实例所表示日期的月份部分。
  178. that.GetMonth = function () {
  179. return ND.getMonth() + 1;
  180. };
  181. //获取此实例所表示日期的小时部分。
  182. that.GetHours = function () {
  183. return ND.getHours();
  184. };
  185. //获取此实例所表示的日期为该月中的第几天。
  186. that.GetDate = function () {
  187. return ND.getDate();
  188. };
  189. //获取此实例所表示日期的分钟部分。
  190. that.GetMinutes = function () {
  191. return ND.getMinutes();
  192. };
  193. //获取此实例所表示日期的秒部分。
  194. that.GetSeconds = function () {
  195. return ND.getSeconds();
  196. };
  197. }
  198. //获取返回的日期
  199. jet.GetDateTime = function (obj,format) {
  200. format = format || 'YYYY-MM-DD hh:mm:ss';
  201. var objVal = $.extend({YYYY:null,MM:null,DD:null,hh:0,mm:0,ss:0},obj),
  202. matArr = {YYYY:"FullYear",MM:"Month",DD:"Date",hh:"Hours",mm:"Minutes",ss:"Seconds"};
  203. var result = new DateTime().reDate();
  204. $.each(["ss","mm","hh","DD","MM","YYYY"],function (i,mat) {
  205. if (!jet.isNum(parseInt(objVal[mat]))) return null;
  206. var reVal = result.GetValue();
  207. if (parseInt(objVal[mat]) || parseInt(objVal[mat]) == 0){
  208. reVal["set"+matArr[mat]](result["Get"+matArr[mat]]() + (mat == "MM" ? -1 : 0) + parseInt(objVal[mat]));
  209. }
  210. });
  211. //获取格式化后的日期
  212. var reParse = jet.parse({
  213. YYYY:result.GetFullYear(), MM:result.GetMonth(), DD:result.GetDate(),
  214. hh:result.GetHours(), mm:result.GetMinutes(), ss:result.GetSeconds()
  215. }, format);
  216. return reParse;
  217. };
  218. //判断元素类型
  219. jet.isValHtml = function(elem) {
  220. return /textarea|input/.test(elem[0].tagName.toLocaleLowerCase());
  221. };
  222. jet.isBool = function(obj){ return (obj == undefined || obj == true ? true : false); };
  223. var searandom = function (){
  224. var str = "",arr = [1,2,3,4,5,6,7,8,9,0];
  225. for(var i=0; i<8; i++) str += arr[Math.round(Math.random() * (arr.length-1))];
  226. return str;
  227. };
  228. function jeDate(elem, opts){
  229. this.opts = opts;
  230. this.valCell = elem;
  231. this.format = this.opts.format;
  232. this.initdates();
  233. }
  234. var jedfn = jeDate.prototype, jefix = "jefixed",matArr = jet.reMatch(regymdzz);
  235. jedfn.initdates = function(){
  236. var that = this, opts = that.opts, newDate = new Date(),
  237. jetrigger = opts.trigger != undefined ? opts.trigger : config.trigger,
  238. zIndex = opts.zIndex == undefined ? 10000 : opts.zIndex,
  239. isinitVal = (opts.isinitVal == undefined || opts.isinitVal == false) ? false : true;
  240. var randomCell = "#jedatebox"+searandom(),isShow = jet.isBool(opts.isShow);
  241. that.areaVal = [];
  242. opts.range = opts.range || config.range;
  243. that.fixed = jet.isBool(opts.fixed);
  244. var formatDate = function (cls,boxcell) {
  245. var dateDiv = $("<div/>",{"id":boxcell.replace(/\#/g,""),"class":"jedatebox "+(opts.skinCell || config.skinCell)}),
  246. reabsfix = !isShow ? "relative" : (that.fixed == true ? "absolute" :"fixed");
  247. dateDiv.attr("author","chen guojun").css({"z-index": boxcell != "#jedatebox" ? "" : zIndex ,"position":reabsfix});
  248. if(boxcell != "#jedatebox") dateDiv.attr({"jeformat":opts.format || config.format,"jefixed":randomCell});
  249. var min = config.minDate.split(" "), max = config.maxDate.split(" ");
  250. jet.minDate = (!/\-/g.test(opts.minDate)&&opts.minDate!=undefined ? min[0]+" "+opts.minDate : opts.minDate) || config.minDate;
  251. jet.maxDate = (!/\-/g.test(opts.maxDate)&&opts.maxDate!=undefined ? max[0]+" "+opts.maxDate : opts.maxDate) || config.maxDate;
  252. jet.boxelem = !isShow ? boxcell : "#jedatebox";
  253. that.format = !isShow ? dateDiv.attr("jeformat") : (opts.format || config.format);
  254. var vals = that.getValue({});
  255. $(cls).append(dateDiv);
  256. that.renderHtml(vals[0].YYYY, vals[0].MM,vals[0].DD, opts,jet.boxelem);
  257. };
  258. //为开启初始化的时间设置值
  259. if (isinitVal && jetrigger) {
  260. //opts.range = undefined;
  261. var ndate = opts.initDate || [], reVal;
  262. if (ndate[1]){
  263. var addval = jet.reMatch(jet.GetDateTime(ndate[0]));
  264. reVal = [{YYYY:addval[0], MM:jet.digit(addval[1]), DD:jet.digit(addval[2]) , hh:jet.digit(addval[3]), mm:jet.digit(addval[4]), ss:jet.digit(addval[5]) }];
  265. }else {
  266. reVal = that.getValue(jet.isObj(ndate[0]) ? ndate[0] : {});
  267. }
  268. that.setValue(reVal[0],opts.format || config.format);
  269. }
  270. //判断固定元素是否存在
  271. if(!isShow){
  272. formatDate(that.valCell,randomCell);
  273. }else {
  274. //insTrigger的值为true时内部默认点击事件
  275. var jd = ["body","#jedatebox"];
  276. if (jetrigger) {
  277. that.valCell.on(jetrigger, function (ev) {
  278. ev.stopPropagation();
  279. if ($(jd[1]).length > 0) return;
  280. formatDate(jd[0],jd[1]);
  281. });
  282. }else {
  283. formatDate(jd[0],jd[1]);
  284. }
  285. }
  286. };
  287. jedfn.parseFormat = function(ymdhms,format) {
  288. return jet.parse(ymdhms,format);
  289. };
  290. //转换日期值
  291. jedfn.parseValue = function (fnStr,matStr) {
  292. var that = this, valArr=[],opts = that.opts, setVal = "",elm = $(jet.boxelem),
  293. formats = matStr == undefined ? ($(elm.attr(jefix)).length > 0 ? elm.attr("jeformat") : that.format) : matStr,
  294. dateStr = $.isFunction(fnStr) ? fnStr() : fnStr;
  295. if (dateStr != "" || dateStr.length > 0 ){
  296. var unrange = opts.range != false,
  297. rangeArr = new Array(unrange ? 2 : 1);
  298. $.each(rangeArr,function (i) {
  299. var rangLen = rangeArr.length == 2,ymdObj = {},parmat = jet.reMatch(formats),
  300. ranArr = rangLen ? dateStr.split(opts.range) : dateStr;
  301. if (rangLen){
  302. $.each(jet.reMatch(ranArr[i]),function (r,val) {
  303. ymdObj[jet.mlen(that.format) == 7 ? parmat[r] : matArr[r]] = val;
  304. });
  305. }
  306. valArr.push(that.parseFormat((rangLen ? ymdObj : ranArr), formats));
  307. ymdObj = {};
  308. });
  309. setVal = valArr.join(unrange ? opts.range : "");
  310. }
  311. return setVal;
  312. };
  313. //设置日期值
  314. jedfn.setValue = function (fnStr,matStr,bool) {
  315. var that = this, elCell = that.valCell,strVal;
  316. if((typeof fnStr=='string')&&fnStr!=''&&that.opts.range == false){
  317. var reVal = jet.reMatch(fnStr), inObj={};
  318. $.each(jet.reMatch(that.format),function (r,val) {
  319. inObj[val] = parseInt(reVal[r]);
  320. });
  321. strVal = inObj;
  322. }else {
  323. strVal = fnStr;
  324. }
  325. var type = jet.isValHtml(elCell) ? "val" : "text",
  326. vals = that.parseValue(strVal,matStr);
  327. if (bool != false) elCell[type](vals);
  328. return vals;
  329. };
  330. //获取日期值
  331. jedfn.getValue = function (valobj) {
  332. var that = this, objCell = that.valCell,
  333. opts = that.opts, reObj, result = new DateTime().reDate(),
  334. dateY = result.GetFullYear(),dateM = result.GetMonth(),dateD = result.GetDate(),
  335. timeh = result.GetHours(),timem = result.GetMinutes(),times = result.GetSeconds();
  336. if (valobj == undefined && jet.isBool(opts.isShow)){
  337. var type = jet.isValHtml(objCell) ? "val" : "text";
  338. reObj = objCell[type]();
  339. }else {
  340. var isValShow = jet.isBool(opts.isShow) ? (that.getValue() == "") : !jet.isBool(opts.isShow),
  341. objarr = $.extend({YYYY:null,MM:null,DD:null},valobj||{}),
  342. ranMat = [],newArr = new Array(2),unObj = function (obj) {
  343. return [(objarr[obj] == undefined || objarr[obj] == null),objarr[obj]]
  344. }, defObj = [{ YYYY:dateY,MM:dateM,DD:dateD, hh:timeh,mm:timem,ss:times,zz:00},
  345. { YYYY:dateY,MM:dateM,DD:dateD, hh:timeh,mm:timem,ss:times,zz:00}];
  346. if (isValShow) {
  347. //目标为空值则获取当前日期时间
  348. $.each(newArr,function (i) {
  349. var inObj = {};
  350. $.each(matArr, function (r, val) {
  351. inObj[val] = parseInt(unObj(val)[0] ? defObj[i][val] : unObj(val)[1]);
  352. });
  353. ranMat.push($.extend(defObj[i], inObj));
  354. });
  355. } else {
  356. var isunRange = opts.range != false, initVal = that.getValue(),
  357. spVal = initVal.split(opts.range), reMat = jet.reMatch(that.format);
  358. $.each(newArr,function (i) {
  359. var inObj = {}, reVal = isunRange ? jet.reMatch(spVal[i]) : jet.reMatch(initVal);
  360. $.each(reMat,function (r,val) {
  361. inObj[val] = parseInt(reVal[r]);
  362. });
  363. var exVal = $.extend(inObj,valobj||{});
  364. ranMat.push($.extend(defObj[i],exVal));
  365. });
  366. }
  367. reObj = ranMat;
  368. }
  369. return reObj;
  370. };
  371. //布局控件骨架
  372. jedfn.renderHtml = function(ys, ms, ds, opts,boxcls){
  373. var that = this, boxCell = $(boxcls),
  374. lang = opts.language || config.language,
  375. isrange = opts.range != false,
  376. isShow = jet.isBool(opts.isShow);
  377. var minTime = jet.minDate.replace(/\s+/g," ").split(" "),
  378. maxTime = jet.maxDate.replace(/\s+/g," ").split(" "),
  379. allvals = that.getValue({YYYY:ys,MM:ms,DD:ds}),
  380. vals = allvals[0], valx = allvals[1];
  381. that.format = isShow ? that.format : boxCell.attr("jeformat");
  382. var mlens = jet.mlen(that.format), testhh = /\hh/.test(that.format);
  383. var clearTxt = lang.name == "cn" ? (!isShow ? "重置":lang.clear):(!isShow ? "Reset":lang.clear);
  384. var headcon = "<div class='arthead'></div><div class='artcont'></div>",
  385. artcont = $("<div/>",{"class":"maincont"}),
  386. footer = $("<div/>",{"class":"mainfoot"}),
  387. daycon = $("<div/>",{"class":"daybox"}).append(headcon),
  388. ymscon = $("<div/>",{"class":"ymsbox"}).append(headcon),
  389. timecon = $("<div/>",{"class":"timebox"}).append(headcon);
  390. artcont.append(ymscon).append(daycon).append(mlens==1||mlens==2?"":timecon);
  391. boxCell.empty().append(artcont.children().hide()).append(footer);
  392. var timeStr = function () {
  393. var emStr = '<em></em><i>:</i><em></em><i>:</i><em></em>';
  394. return isrange ? emStr +"<span> ~ </span>"+ emStr : emStr;
  395. },
  396. btnStr = '<span class="clear">'+clearTxt+'</span><span class="today">'+lang.today+'</span><span class="setok">'+lang.yes+'</span>',
  397. timeDiv = $("<div/>",{"class":"timecon"}).append(timeStr()),
  398. btnsDiv = $("<div/>",{"class":"btnscon"}).append(btnStr);
  399. footer.append(timeDiv).append(btnsDiv);
  400. boxCell.append($("<div/>",{"class":"jedate-tips"}).hide());
  401. that.maincon = function (elem,is) { return boxCell.find(elem+" > "+(is == 0 ? ".arthead":".artcont")); };
  402. //设置时分秒
  403. if (testhh) {
  404. var minVal = /\s/.test(jet.minDate) ? minTime[1] : minTime[0],
  405. maxVal = /\s/.test(jet.maxDate) ? maxTime[1] : maxTime[0];
  406. var rehms = jet.reMatch(minVal), vehms = [vals.hh, vals.mm, vals.ss], hms = [];
  407. if (isrange) {
  408. if (that.getValue() == "") {
  409. hms = mlens == 7 ? rehms.concat(rehms) : rehms.concat([00, 00, 00]);
  410. } else {
  411. hms = vehms.concat([valx.hh, valx.mm, valx.ss]);
  412. }
  413. }else {
  414. hms = vehms;
  415. }
  416. $.each(footer.find(".timecon em"), function (i, cls) {
  417. $(this).text(jet.digit(hms[i]));
  418. });
  419. }else {
  420. footer.find(".timecon").hide();
  421. }
  422. //根据日期格式进行对应的日期时间显示
  423. if(mlens == 7){
  424. that.maincon(".timebox",0).html(lang.titText);
  425. boxCell.find(".timebox").show();
  426. that.eachHms(opts,boxCell);
  427. }else if(mlens>=3 && mlens<=6){
  428. that.maincon(".daybox",0).append('<em class="yearprev yprev"></em><em class="monthprev mprev"></em><em class="monthnext mnext"></em><em class="yearnext ynext"></em>');
  429. boxCell.find(".daybox").show();
  430. that.eachDays(vals.YYYY, vals.MM, vals.DD, opts, boxCell);
  431. //判断日期格式中是否包含hh(时)
  432. if(testhh){
  433. that.maincon(".timebox",1).attr("cont","no");
  434. that.maincon(".timebox",0).html(lang.titText+'<em class="close"></em>');
  435. boxCell.find(".timecon").on("click",function () {
  436. if (that.maincon(".timebox",1).attr("cont") == "no"){
  437. that.maincon(".timebox",1).attr("cont","yes");
  438. boxCell.find(".ymsbox,.daybox").hide();
  439. boxCell.find(".timebox").show();
  440. that.eachHms(opts,boxCell);
  441. that.dateOrien(boxCell, that.valCell);
  442. }
  443. });
  444. that.maincon(".timebox",0).on("click",".close",function () {
  445. that.maincon(".timebox",1).html("").attr("cont","no");
  446. boxCell.find(".ymsbox,.timebox").hide();
  447. boxCell.find(".daybox").show();
  448. that.dateOrien(boxCell, that.valCell);
  449. });
  450. timeDiv.css({"cursor":"pointer"});
  451. }
  452. //将所有子元素用一个生成的div将所有段落包裹起来
  453. that.maincon(".ymsbox",0).append('<em class="yearprev yprev"></em><em class="yearnext ynext"></em><em class="close"></em>').addClass("ymfix");
  454. //将生成的年月插入到元素中
  455. that.eachYM(vals.YYYY, vals.MM, opts, boxCell,".fixcon");
  456. }
  457. //为年月的情况下执行
  458. if(mlens==1 || mlens==2){
  459. that.maincon(".ymsbox",0).append('<em class="yearprev yprev"></em><em class="yearnext ynext"></em>');
  460. boxCell.find(".ymsbox").show();
  461. that.eachYM(vals.YYYY, vals.MM, opts, boxCell,".jedate-cont");
  462. }
  463. //是否开启时间选择
  464. if(!jet.isBool(opts.isTime) || !isShow){
  465. footer.find(".timecon").hide();
  466. }
  467. if(!isShow) footer.find(".today").hide();
  468. //绑定各个事件
  469. that.eventsDate(opts,boxCell);
  470. setTimeout(function () {
  471. opts.success && opts.success(boxCell);
  472. }, 50);
  473. };
  474. jedfn.createYMHtml = function(ys, ms, opts){
  475. var year = parseInt(ys), month = parseInt(ms), headCls = this.maincon(".daybox",0);
  476. var ymCls = $("<p/>").css({"width":jet.isBool(opts.multiPane) ? '':'50%'}),
  477. ymText = "<span class='ymbtn'>"+month+"\u6708 "+year+"\u5e74</span>";
  478. headCls.append(ymCls.html(ymText));
  479. return year+"-"+month;
  480. };
  481. //循环生成年或月
  482. jedfn.eachYM = function(y, m,opts,boxCell,clsCell) {
  483. var that = this, yearArr = new Array(15), date = new Date(),
  484. lang = opts.language || config.language, ymscon = that.maincon(".ymsbox",1),
  485. multiPane = jet.isBool(opts.multiPane), mlens = jet.mlen(that.format),
  486. ymarr = that.getValue({}),testhh = /\hh/.test(that.format),
  487. formatYY = mlens == 1;
  488. if(ymscon.find(".ymcon").length > 0) ymscon.find(".ymcon").remove();
  489. $.each(new Array(multiPane ? 1 : 2),function (s) {
  490. var retSetCls = function (sym,gym,eym) {
  491. var sval = sym.replace(gr,""), gval = gym.replace(gr,""), eval = eym.replace(gr,"");
  492. if (/YYYY-MM-DD/g.test(jet.isparmat(that.format))){
  493. return (parseInt(sval) == parseInt(gval)) ? (s == 0 ? "actdate" : "") : "";
  494. }else {
  495. if (parseInt(sval) == parseInt(gval)) {
  496. if (!testhh) {
  497. that.areaVal.push(sym);
  498. that.areaStart = true;
  499. }
  500. return "actdate";
  501. } else if (parseInt(sval) > parseInt(gval) && parseInt(sval) < parseInt(eval)) {
  502. return "contain";
  503. } else if (parseInt(sval) == parseInt(eval)) {
  504. if (!testhh) {
  505. that.areaVal.push(sym);
  506. that.areaStart = true;
  507. }
  508. return "actdate";
  509. } else {
  510. return "";
  511. }
  512. }
  513. };
  514. var ymDiv = $("<div/>",{"class":"ymcon"}).addClass(s==1 ? "spaer":""),ymArr=[];
  515. $.each(formatYY ? yearArr : lang.month, function (n, val) {
  516. var ym = s==1 ? y + (formatYY ? yearArr.length : 1) : y,seCls;
  517. n = s==1 ? (formatYY ? 15+n : 12+n) : n;
  518. if (formatYY) {
  519. var minArr = jet.splMatch(jet.minDate), maxArr = jet.splMatch(jet.maxDate),
  520. minY = minArr[0], maxY = maxArr[0], year = (ym - 7 + n),
  521. getyear = (that.getValue() == "" && jet.isBool(opts.isShow)) ? date.getFullYear() : that.getValue();
  522. //判断是否在有效期内
  523. if (year < minY || year > maxY) {
  524. ymArr.push({style:"disabled",ym: year,idx:n});
  525. } else {
  526. seCls = retSetCls(year.toString(),getyear.toString(),ymarr[1].YYYY.toString());
  527. ymArr.push({style:seCls,ym: year,idx:n});
  528. }
  529. } else {
  530. var minArr = jet.splMatch(jet.minDate), maxArr = jet.splMatch(jet.maxDate),
  531. thisDate = parseInt(ym+""+jet.digit(val)+""+"01"),
  532. minTime = parseInt(minArr[0]+""+jet.digit(minArr[1])+""+jet.digit(minArr[2])),
  533. maxTime = parseInt(maxArr[0]+""+jet.digit(maxArr[1])+""+jet.digit(maxArr[2]));
  534. //判断是否在有效期内
  535. if (thisDate < minTime || thisDate > maxTime) {
  536. ymArr.push({style:"disabled",ym: ym + "-" + jet.digit(val),idx:n});
  537. } else {
  538. var ymVal = ym + "-" + jet.digit(val),ymmVal = ymarr[0].YYYY+ "-" + jet.digit(ymarr[0].MM);
  539. seCls = retSetCls(ymVal,ymmVal,(ymarr[1].YYYY+ "-" + jet.digit(ymarr[1].MM)));
  540. ymArr.push({style:seCls,ym: ym + "-" + jet.digit(val),idx:n});
  541. }
  542. }
  543. });
  544. var table = $('<table/>',{"class":formatYY ?"yul":"ymul"});
  545. //生成表格主体
  546. $.each(new Array(formatYY ? 5:4), function(i){
  547. var tr = $('<tr/>');
  548. $.each(new Array(3), function(){
  549. var td = $("<td/>");
  550. table.append(tr.append(td));
  551. })
  552. });
  553. //为表格赋值年月
  554. $.each(ymArr,function (i,val) {
  555. table.find("td").eq(i).addClass(val.style).attr({idx:val.idx,"je-val":val.ym}).html(val.ym)
  556. });
  557. ymscon.append(ymDiv.append(table));
  558. });
  559. var contd = ymscon.find("td"),ymstit = that.maincon(".ymsbox",0),
  560. eqNum = formatYY ? (multiPane ? 15-1:15*2-1):(multiPane ? 12-1:12*2-1),
  561. sval = contd.eq(0).text(), eval = contd.eq(eqNum).text();
  562. var mnx = [(formatYY ? sval:sval.substring(0,4)),(formatYY ? eval:eval.substring(0,4))];
  563. ymstit.find("p").remove();
  564. ymstit.append("<p>"+sval+" ~ "+eval+"</p>").attr({min:mnx[0],max:mnx[1]});
  565. };
  566. //初始验证正则
  567. jedfn.dateRegExp = function(valArr) {
  568. var enval = valArr.split(",")||[], re = "";
  569. var doExp = function (val) {
  570. var arr, tmpEval, re = /#?\{(.*?)\}/;
  571. val = val + "";
  572. while ((arr = re.exec(val)) != null) {
  573. arr.lastIndex = arr.index + arr[1].length + arr[0].length - arr[1].length - 1;
  574. tmpEval = parseInt(eval(arr[1]));
  575. if (tmpEval < 0) tmpEval = "9700" + -tmpEval;
  576. val = val.substring(0, arr.index) + tmpEval + val.substring(arr.lastIndex + 1);
  577. }
  578. return val;
  579. };
  580. if (enval && enval.length > 0) {
  581. for (var i = 0; i < enval.length; i++) {
  582. re += doExp(enval[i]);
  583. if (i != enval.length - 1) re += "|";
  584. }
  585. re = re ? new RegExp("(?:" + re + ")") : null;
  586. } else {
  587. re = null;
  588. }
  589. //re = new RegExp((re + "").replace(/^\/\(\?:(.*)\)\/.*/, "$1"));
  590. return re;
  591. };
  592. //循环生成日
  593. jedfn.eachDays = function(ys, ms,ds, opts, boxCell){
  594. var that = this, isShow = jet.isBool(opts.isShow);
  595. var year = parseInt(ys), month = parseInt(ms), objCell = that.valCell,
  596. lang = opts.language || config.language, endval = opts.valiDate||[],
  597. minArr = jet.reMatch(jet.minDate), minNum = parseInt(minArr[0]+""+jet.digit(minArr[1])+""+jet.digit(minArr[2])),
  598. maxArr = jet.reMatch(jet.maxDate), maxNum = parseInt(maxArr[0]+""+jet.digit(maxArr[1])+""+jet.digit(maxArr[2]));
  599. var multiPane = jet.isBool(opts.multiPane), ymdarr = that.getValue(!isShow ? {YYYY:ys,MM:ms,DD:ds}:{}),
  600. valrange = ((objCell.val() || objCell.text()) != "") && opts.range != false,
  601. ymdDate = parseInt(ymdarr[0].YYYY+""+jet.digit(ymdarr[0].MM)+""+jet.digit(ymdarr[0].DD));
  602. //设置时间标注
  603. var setMark = function (my, mm, md) {
  604. var Marks = opts.marks, contains = function(arr, obj) {
  605. var len = arr.length;
  606. while (len--) {
  607. if (arr[len] === obj) return true;
  608. }
  609. return false;
  610. };
  611. return $.isArray(Marks) && Marks.length > 0 && contains(Marks, my + "-" + jet.digit(mm) + "-" + jet.digit(md)) ? '<i class="marks"></i>' :"";
  612. };
  613. //是否显示节日
  614. var isfestival = function(y, m ,d) {
  615. var festivalStr;
  616. if(opts.festival == true && lang.name == "cn"){
  617. var lunar = that.jeLunar(y, m - 1, d), feslunar = (lunar.solarFestival || lunar.lunarFestival),
  618. lunartext = (feslunar && lunar.jieqi) != "" ? feslunar : (lunar.jieqi || lunar.showInLunar);
  619. festivalStr = '<p><span class="solar">' + d + '</span><span class="lunar">' + lunartext + '</span></p>';
  620. }else{
  621. festivalStr = '<p class="nolunar">' + d + '</p>';
  622. }
  623. return festivalStr;
  624. };
  625. //判断是否在限制的日期之中
  626. var dateLimit = function(Y, M, D, isMonth){
  627. var thatNum = parseInt(Y + "" + jet.digit(M) + "" + jet.digit(D));
  628. if(isMonth){
  629. if (thatNum >= minNum && thatNum <= maxNum) return true;
  630. }else {
  631. if (minNum > thatNum || maxNum < thatNum) return true;
  632. }
  633. };
  634. var eachDays = function (yd,md) {
  635. var count = 0, daysArr = [],
  636. firstWeek = new Date(yd, md - 1, 1).getDay() || 7,
  637. daysNum = jet.getDaysNum(yd, md), didx = 0,
  638. prevM = jet.prevMonth(yd, md),
  639. prevDaysNum = jet.getDaysNum(yd, prevM.m),
  640. nextM = jet.nextMonth(yd, md);
  641. //上一月剩余天数
  642. for (var p = prevDaysNum - firstWeek + 1; p <= prevDaysNum; p++, count++) {
  643. var pmark = setMark(prevM.y,prevM.m,p);
  644. var cls = dateLimit(prevM.y, prevM.m, p, false) ? "disabled" : "other";
  645. daysArr.push({style:cls,ymd:prevM.y+'-'+prevM.m+'-'+p,day:p,d:(isfestival(prevM.y,prevM.m,p) + pmark),idx:didx++});
  646. }
  647. //本月的天数
  648. for(var b = 1; b <= daysNum; b++, count++){
  649. var bmark = setMark(yd,md,b), cls = "";
  650. var dateval = parseInt(yd+""+jet.digit(md)+""+jet.digit(b)),
  651. rangval = parseInt(ymdarr[1].YYYY+""+jet.digit(ymdarr[1].MM)+""+jet.digit(ymdarr[1].DD)),
  652. parsdate = dateval > ymdDate, rangdate = dateval < rangval;
  653. if(dateLimit(yd, md, b, true)){
  654. if(dateval == ymdDate){
  655. cls = "actdate";
  656. that.areaVal.push(yd+'-'+jet.digit(md)+'-'+jet.digit(b));
  657. that.areaStart = true;
  658. }else if(parsdate&&rangdate&&valrange){
  659. cls = "contain";
  660. }else if((dateval == rangval)&&valrange){
  661. cls = "actdate";
  662. that.areaVal.push(yd+'-'+jet.digit(md)+'-'+jet.digit(b));
  663. that.areaEnd = true;
  664. }else {
  665. cls = "";
  666. }
  667. }else {
  668. cls = "disabled";
  669. }
  670. daysArr.push({style:cls,ymd:yd+'-'+md+'-'+b,day:b,d:(isfestival(yd,md,b) + bmark),idx:didx++});
  671. }
  672. //下一月开始天数
  673. for(var n = 1, nlen = 42 - count; n <= nlen; n++){
  674. var nmark = setMark(nextM.y,nextM.m,n);
  675. var cls = dateLimit(nextM.y, nextM.m, n, false) ? "disabled" : "other";
  676. daysArr.push({style:cls,ymd:nextM.y+'-'+nextM.m+'-'+n,day:n,d:(isfestival(nextM.y,nextM.m,n) + nmark),idx:didx++});
  677. }
  678. //将星期与日期拼接起来
  679. return daysArr;
  680. };
  681. var valdigit = function (val) {
  682. var spval = jet.reMatch(val) , rearr = [];
  683. $.each(spval,function (i,v) {
  684. rearr.push(jet.digit(v));
  685. });
  686. return rearr.join("-");
  687. };
  688. var moreArr = new Array(multiPane ? 1 : 2), isDec = (month + 1 > 12),ymarr = [];
  689. $.each(moreArr,function (d,val) {
  690. var table = $('<table/>',{"class":"daysul"}) ,thead = $('<thead/>'),
  691. tbody = $('<tbody/>'), t= d == 1 ? 42:0;
  692. table.append(thead).append(tbody);
  693. //生成表格主体
  694. $.each(new Array(7), function(i){
  695. var tr = $('<tr/>');
  696. $.each(new Array(7), function(){
  697. var th = $("<th/>"), td = $("<td/>");
  698. tr.append(i == 0 ? th : td.attr("idx",t++));
  699. i == 0 ? thead.append(tr) : tbody.append(tr);
  700. })
  701. });
  702. var nian = (isDec && d == 1) ? year+1 : year,
  703. yue = (isDec && d == 1) ? 1 : (d == 1 ? month+1 : month);
  704. var arrDay = eachDays(nian,yue);
  705. var moreCls = $("<div/>",{'class':'contlist'});
  706. //赋值星期
  707. $.each(lang.weeks,function (i,val) {
  708. table.find("th").eq(i).text(val);
  709. });
  710. ymarr.push(that.createYMHtml(nian,yue, opts));
  711. $.each(arrDay,function (i,val) {
  712. var clsVal = val.style;
  713. if(endval.length > 0 && endval[0]!=""){
  714. if(/\%/g.test(endval[0])){
  715. var reval = endval[0].replace(/\%/g,"").split(","), enArr = [];
  716. $.each(reval,function (r,rel) {
  717. enArr.push(jet.digit(parseInt(rel)));
  718. });
  719. var isfind = $.inArray(jet.digit(val.day), enArr) == -1;
  720. clsVal = jet.isBool(endval[1]) ? (isfind ? "disabled" :clsVal) : (isfind ? clsVal :"disabled");
  721. }else {
  722. var valreg = that.dateRegExp(endval[0]), regday = valreg.test(jet.digit(val.day));
  723. clsVal = jet.isBool(endval[1]) ? (regday ? "disabled" : val.style) : (regday ? val.style : "disabled")
  724. }
  725. }
  726. table.find("td").eq(i).addClass(clsVal).attr("je-val",valdigit(val.ymd)).html(val.d);
  727. });
  728. that.maincon(".daybox",1).append(moreCls.append(table)).addClass(d == 1 ? "spaer" : "");
  729. });
  730. that.maincon(".daybox",0).attr("je-ym",ymarr.join(","));
  731. };
  732. //循环生成时分秒
  733. jedfn.eachHms = function(opts,boxCell) {
  734. var that = this, lang = opts.language || config.language,
  735. multiPane = jet.isBool(opts.multiPane),
  736. gval = that.getValue({}), isVal = that.getValue() == "",
  737. ranges = opts.range == false,
  738. minTime = jet.minDate.replace(/\s+/g," ").split(" "),
  739. maxTime = jet.maxDate.replace(/\s+/g," ").split(" "),
  740. isymdh = /YYYY-MM-DD/g.test(jet.isparmat(that.format)) && /\hh/.test(that.format);
  741. var minhms = jet.reMatch(minTime[1]),
  742. maxhms = jet.reMatch(maxTime[1]);
  743. var hmsCell = that.maincon(".timebox",1),
  744. clas = ["action","disabled"],inputs = boxCell.find(".mainfoot .timecon em");
  745. //conhms = isymdh ? hmsCell.parent() : hmsCell;
  746. var date = new Date(), timeh = date.getHours(),
  747. timem = date.getMinutes(),times = date.getSeconds();
  748. var minVal = [gval[0].hh||timeh,gval[0].mm||timem,gval[0].ss||times],
  749. maxVal = [gval[1].hh||timeh,gval[1].mm||timem,gval[1].ss||times];
  750. if (opts.range == false && boxCell.find(".timelist").length > 0) return;
  751. $.each(new Array(ranges ? 1 : 2),function (m) {
  752. var timeList = $("<div/>",{"class":"timelist"}).css({width:ranges ? "100%":"50%",float:ranges ? "":"left"}),
  753. timeDiv = $("<div/>",{"class":"contime"}), textDiv = $("<div/>",{"class":"textbox"});
  754. var timetxt = textDiv.append('<p>'+lang.times[0]+'</p><p>'+lang.times[1]+'</p><p>'+lang.times[2]+'</p>');
  755. timeList.append(timetxt);
  756. hmsCell.addClass(m==1 ? "spaer":"");
  757. $.each([24, 60, 60],function (i,lens) {
  758. var hmsCls = "",tuls = $("<ul/>").attr("idx",m==1 ? 3+i : i),
  759. textem = inputs.eq(i).text();
  760. for (var h = 0; h < lens; h++) {
  761. var tlis = $("<li/>");
  762. //判断限制时间范围的状态
  763. if (opts.range != false){
  764. if (isymdh){
  765. if (m==0){
  766. if (h >= minhms[i]) {
  767. hmsCls = h == (isVal ? minhms[i]:minVal[i]) ? clas[0] : "";
  768. } else{
  769. hmsCls = clas[1];
  770. }
  771. }else {
  772. if (h > maxhms[i]) {
  773. hmsCls = clas[1];
  774. }else {
  775. hmsCls = h == (isVal ? 0:maxVal[i]) ? clas[0] : "";
  776. }
  777. }
  778. }else {
  779. if (h >= minhms[i]) {
  780. hmsCls = h == (isVal ? minhms[i]:(m==0?minVal[i]:maxVal[i])) ? clas[0] : "";
  781. } else{
  782. hmsCls = clas[1];
  783. }
  784. }
  785. }else{
  786. if (h >= minhms[i] && h <= maxhms[i]){
  787. if (textem < minhms[i]){
  788. hmsCls = h == minhms[i] ? clas[0] : "";
  789. }else if (textem > maxhms[i]){
  790. hmsCls = h == maxhms[i] ? clas[0] : "";
  791. }else {
  792. hmsCls = h == textem ? clas[0] : "";
  793. }
  794. }else {
  795. hmsCls = clas[1];
  796. }
  797. }
  798. tlis.text(jet.digit(h)).addClass(hmsCls);
  799. hmsCell.append(timeList.append(timeDiv.append(tuls.append(tlis))));
  800. }
  801. });
  802. if (multiPane==false && ranges){
  803. timeList.css({"padding-left":timeList.outerWidth()/2+12,"padding-right":timeList.outerWidth()/2+12})
  804. }
  805. });
  806. //计算当前时分秒的位置
  807. that.locateScroll(hmsCell.find("ul"));
  808. //时分秒选择
  809. that.clickTime(opts,boxCell);
  810. var hmsTxt = [];
  811. $.each(minhms,function (i,val) {
  812. if (parseInt(val) > parseInt(maxhms[i])){
  813. hmsTxt.push("不能大于最大"+lang.times[i]);
  814. }
  815. });
  816. if (hmsTxt.length > 0) that.tips(hmsTxt.join("<br/>"),4.5);
  817. };
  818. //为日期绑定各类事件
  819. jedfn.eventsDate = function(opts,boxCell) {
  820. var that = this, multiPane = jet.isBool(opts.multiPane);
  821. //上下月事件
  822. that.clickYM(opts,boxCell);
  823. //点击天事件
  824. that.clickDays(opts,boxCell);
  825. //按钮事件
  826. that.clickBtn(opts,boxCell);
  827. //自适应定位,值在isShow为true的情况下有效
  828. if(jet.isBool(opts.isShow)){
  829. var datepos = opts.position||[];
  830. if (datepos.length > 0){
  831. boxCell.css({"top":datepos[0],"left":datepos[1]});
  832. }else {
  833. that.dateOrien(boxCell, that.valCell);
  834. $(window).on("resize", function(){
  835. that.dateOrien(boxCell, that.valCell);
  836. })
  837. }
  838. }
  839. //点击空白处隐藏
  840. $(document).on("mouseup", function(ev) {
  841. ev.stopPropagation();
  842. if (jet.boxelem == "#jedatebox"){
  843. var box = $(jet.boxelem);
  844. if (box && box.css("display") !== "none") that.dateClose();
  845. if($("#jedatetipscon").length > 0) $("#jedatetipscon").remove();
  846. delete that.areaStart;
  847. delete that.areaEnd;
  848. that.areaVal = [];
  849. }
  850. });
  851. $(jet.boxelem).on("mouseup", function(ev) {
  852. ev.stopPropagation();
  853. });
  854. };
  855. //切换年月并重新生成日历
  856. jedfn.clickYM = function (opts,boxCell) {
  857. var that = this, ymhead = that.maincon(".ymsbox",0),elemCell = that.valCell,
  858. yPre = ymhead.find(".yprev"), yNext = ymhead.find(".ynext"),
  859. ymdhead = that.maincon(".daybox",0),isShow = jet.isBool(opts.isShow),
  860. ydPre = ymdhead.find(".yprev"), ydNext = ymdhead.find(".ynext"),
  861. mdPre = ymdhead.find(".mprev"), mdNext = ymdhead.find(".mnext"),
  862. mlens = jet.mlen(that.format),isYYMM = mlens == 2, isYY = mlens == 1;
  863. var carr = ["actdate","contain"],ymDate = new Date();
  864. var clickYmSelected = function () {
  865. var ulCell = that.maincon(".ymsbox",1).find(".ymcon"), tdCell = ulCell.find("td");
  866. tdCell.on("click",function () {
  867. var lithis = $(this), thisdate = lithis.attr("je-val");
  868. if (lithis.hasClass("disabled")) return;
  869. if(opts.range == false){
  870. tdCell.removeClass(carr[0]);
  871. lithis.addClass(carr[0]);
  872. that.maincon(".ymsbox",0).attr("data-val",lithis.text());
  873. }else {
  874. //判断是否存在选择的开始与结束日期
  875. if (that.areaStart && that.areaEnd == undefined){
  876. lithis.addClass(carr[0]);
  877. that.areaEnd = true;
  878. //添加当前选中的到数组中
  879. that.areaVal.push(thisdate);
  880. //遍历元素,并在范围中查找同时着色
  881. tdCell.each(function () {
  882. var sefl = $(this),seVals = sefl.attr("je-val").replace(gr,""),
  883. rearea = [that.areaVal[0].replace(gr,""),that.areaVal[1].replace(gr,"")],
  884. minVal = Math.min.apply(null, rearea), maxVal = Math.max.apply(null, rearea);
  885. if (!sefl.hasClass("other")){
  886. var contrast = parseInt(seVals) > parseInt(minVal) && parseInt(seVals) < parseInt(maxVal);
  887. if(contrast){
  888. sefl.addClass(carr[1]);
  889. }
  890. }
  891. });
  892. }else if (that.areaStart && that.areaEnd){
  893. //如果已经选择了一个范围,就清除属性
  894. that.delAreaAttr();
  895. tdCell.removeClass(carr[0]).removeClass(carr[1]);
  896. lithis.addClass(carr[0]);
  897. that.areaVal.push(thisdate);
  898. that.areaStart = true;
  899. }
  900. }
  901. });
  902. };
  903. if(isYYMM || isYY){
  904. clickYmSelected();
  905. //年或年月情况下的变化
  906. $.each([yPre, yNext], function (ym, cls) {
  907. cls.on("click", function (ev) {
  908. var cthat = $(this), ymMonth = ymDate.getMonth()+1,
  909. ymMin = parseInt(cthat.parent().attr("min")), ymMax = parseInt(cthat.parent().attr("max"));
  910. var ymYear =isYY ? (ym == 0 ? ymMin : ymMax) : (ym == 0 ? --ymMin : ++ymMax);
  911. that.renderHtml(ymYear, ymMonth, null, opts, boxCell);
  912. if (opts.range == false) {
  913. var ymobj = isYY ? {YYYY: ymYear} : {YYYY: ymYear, MM: ymMonth};
  914. var value = that.parseValue(ymobj),
  915. date = {
  916. YYYY: ymYear, MM: ymMonth, DD: ymDate.getDate(),
  917. hh: ymDate.getHours(), mm: ymDate.getMinutes(), ss: ymDate.getSeconds()
  918. };
  919. if ($.isFunction(opts.toggle)) opts.toggle(elemCell,value,date);
  920. }
  921. })
  922. })
  923. }else {
  924. //切换年
  925. $.each([ydPre, ydNext], function (y, cls) {
  926. cls.on("click", function (ev) {
  927. ev.stopPropagation();
  928. var gym = jet.reMatch($(this).parent().attr("je-ym"));
  929. var year = parseInt(gym[0]), month = parseInt(gym[1]),
  930. pnYear = y == 0 ? --year : ++year;
  931. that.renderHtml(pnYear, month, null, opts, boxCell);
  932. if (opts.range == false) {
  933. var gv = that.getValue({})[0];
  934. var value = that.parseValue({YYYY: pnYear, MM: month, DD: gv.DD}),
  935. dateobj = {
  936. YYYY: pnYear, MM: month, DD: ymDate.getDate(),
  937. hh: ymDate.getHours(), mm: ymDate.getMinutes(), ss: ymDate.getSeconds()
  938. };
  939. if ($.isFunction(opts.toggle)) opts.toggle({elem:elemCell,val:value,date:dateobj});
  940. }
  941. });
  942. });
  943. //切换月
  944. $.each([mdPre, mdNext], function (m, cls) {
  945. cls.on("click", function (ev) {
  946. ev.stopPropagation();
  947. var gym = jet.reMatch($(this).parent().attr("je-ym"));
  948. var year = parseInt(gym[0]), month = parseInt(gym[1]),
  949. PrevYM = jet.prevMonth(year, month), NextYM = jet.nextMonth(year, month);
  950. m == 0 ? that.renderHtml(PrevYM.y, PrevYM.m, null, opts, boxCell) : that.renderHtml(NextYM.y, NextYM.m, null, opts, boxCell);
  951. var yearVal = m == 0 ? PrevYM.y : NextYM.y, monthVal = m == 0 ? PrevYM.m : NextYM.m;
  952. if (opts.range == false) {
  953. var gv = that.getValue({})[0];
  954. var value = that.parseValue({YYYY: yearVal, MM: monthVal, DD: gv.DD}),
  955. dateobj = {
  956. YYYY: yearVal, MM: monthVal, DD: ymDate.getDate(),
  957. hh: ymDate.getHours(), mm: ymDate.getMinutes(), ss: ymDate.getSeconds()
  958. };
  959. if ($.isFunction(opts.toggle)) opts.toggle({elem:elemCell,val:value,date:dateobj});
  960. }
  961. });
  962. });
  963. }
  964. if(mlens >= 3 && mlens <= 6){
  965. that.maincon(".daybox",0).on("click",".ymbtn", function (ev) {
  966. boxCell.children(".ymsbox").show();
  967. boxCell.children(".daybox,.mainfoot").hide();
  968. if (isShow) that.dateOrien(boxCell, that.valCell);
  969. });
  970. var aloneSelym = function () {
  971. var ulCell = boxCell.find(".ymcon"), tdCell = ulCell.find("td");
  972. tdCell.on("click",function () {
  973. var sefl = $(this), seval = jet.reMatch(sefl.attr("je-val"));
  974. tdCell.removeClass(carr[0]);
  975. sefl.addClass(carr[0]);
  976. boxCell.children(".jedate-contfix").show();
  977. boxCell.children(".jedate-jedatewrap").hide();
  978. that.renderHtml(seval[0], seval[1],null, opts,boxCell);
  979. })
  980. };
  981. $.each([yPre, yNext], function (ym, cls) {
  982. cls.on("click", function (ev) {
  983. var ymMonth = ymDate.getMonth()+1,
  984. ymMin = parseInt($(this).parent().attr("min")), ymMax = parseInt($(this).parent().attr("max"));
  985. var ymYear =isYY ? (ym == 0 ? ymMin : ymMax) : (ym == 0 ? --ymMin : ++ymMax);
  986. that.eachYM(ymYear, ymMonth, opts, boxCell,".jedate-contfix");
  987. aloneSelym();
  988. if (isShow) that.dateOrien(boxCell, that.valCell);
  989. if ($.isFunction(opts.toggle)) opts.toggle();
  990. })
  991. });
  992. ymhead.on("click",".close", function (ev) {
  993. boxCell.children(".daybox,.mainfoot").show();
  994. boxCell.children(".ymsbox").hide();
  995. if (isShow) that.dateOrien(boxCell, that.valCell);
  996. });
  997. aloneSelym();
  998. }
  999. };
  1000. jedfn.gethmsVal = function(boxCell) {
  1001. var hmsArr = {};
  1002. boxCell.find(".timecon em").each(function(i) {
  1003. var disb = $(this).attr('disabled');
  1004. if(disb == undefined) hmsArr[matArr[3+i]] = $(this).text();
  1005. });
  1006. return hmsArr;
  1007. };
  1008. //绑定天的事件
  1009. jedfn.clickDays = function (opts,boxCell) {
  1010. var that = this, elemCell = that.valCell,valStr = "je-val",
  1011. ulCls = boxCell.find(".daysul"), tdCls = ulCls.find("td"),
  1012. lang = opts.language || config.language,
  1013. carr = ["actdate","contain"];
  1014. //点击绑定日期事件
  1015. tdCls.on("click", function(ev) {
  1016. var lithis = $(this), thisdate = lithis.attr(valStr),
  1017. ymdArr = jet.reMatch(thisdate), dayArr = [];
  1018. if (lithis.hasClass("disabled")) return;
  1019. ev.stopPropagation();
  1020. //单独选择
  1021. var aloneSelected = function () {
  1022. $.each(ymdArr,function (i,val) {
  1023. dayArr.push(parseInt(val));
  1024. });
  1025. if($(boxCell.attr(jefix)).length > 0 ){
  1026. that.renderHtml(dayArr[0], dayArr[1],dayArr[2], opts,boxCell);
  1027. }else {
  1028. //判断是否为点击后关闭弹层
  1029. if(jet.isBool(opts.onClose)){
  1030. tdCls.removeClass(carr[0]);
  1031. lithis.addClass(carr[0]);
  1032. }else {
  1033. var ymdObj = {}, spval = jet.reMatch(lithis.attr(valStr));
  1034. //获取时分秒的集合
  1035. $.each(spval,function (i,val) {
  1036. ymdObj[matArr[i]] = val;
  1037. });
  1038. var objs = /\hh/.test(that.format) ? $.extend(ymdObj,that.gethmsVal(boxCell)) : ymdObj;
  1039. var vals = that.setValue(objs);
  1040. that.dateClose();
  1041. if ($.isFunction(opts.okfun) || opts.okfun != null){
  1042. opts.okfun && opts.okfun({elem:elemCell,val:vals,date:objs});
  1043. }
  1044. }
  1045. }
  1046. };
  1047. //区域选择
  1048. var areaSelected = function () {
  1049. //判断是否只选中一个
  1050. if (that.areaStart && that.areaEnd == undefined){
  1051. lithis.addClass(carr[0]);
  1052. that.areaEnd = true;
  1053. //添加当前选中的到数组中
  1054. that.areaVal.push(thisdate);
  1055. //遍历元素,并在范围中查找同时着色
  1056. tdCls.each(function () {
  1057. var sefl = $(this),seVals = sefl.attr("je-val").replace(gr,""),
  1058. rearea = [that.areaVal[0].replace(gr,""),that.areaVal[1].replace(gr,"")],
  1059. minVal = Math.min.apply(null, rearea), maxVal = Math.max.apply(null, rearea);
  1060. if (!sefl.hasClass("other") && !sefl.hasClass("disabled")){
  1061. var contrast = parseInt(seVals) > parseInt(minVal) && parseInt(seVals) < parseInt(maxVal);
  1062. if(contrast){
  1063. sefl.addClass(carr[1]);
  1064. }
  1065. }
  1066. });
  1067. }else if (that.areaStart && that.areaEnd){
  1068. //如果已经选择了一个范围,就清除属性
  1069. that.delAreaAttr();
  1070. tdCls.removeClass(carr[0]).removeClass(carr[1]);
  1071. lithis.addClass(carr[0]);
  1072. that.areaVal.push(thisdate);
  1073. that.areaStart = true;
  1074. }
  1075. };
  1076. //判断是否要进行日期区域选择
  1077. opts.range == false ? aloneSelected() : areaSelected();
  1078. });
  1079. if(opts.festival && lang.name == "cn") {
  1080. boxCell.addClass("grid");
  1081. //鼠标进入提示框出现
  1082. tdCls.on("mouseover", function () {
  1083. if($("#jedatetipscon").length > 0) $("#jedatetipscon").remove();
  1084. var _this = $(this), atlunar = jet.reMatch(_this.attr(valStr)),
  1085. tipDiv = $("<div/>",{"id":"jedatetipscon","class":"jedatetipscon"}),
  1086. lunar = that.jeLunar(parseInt(atlunar[0]), parseInt(atlunar[1]) - 1, parseInt(atlunar[2]));
  1087. var tiphtml = '<p>' + lunar.solarYear + '\u5E74' + lunar.solarMonth + '\u6708' + lunar.solarDate + '\u65E5 ' + lunar.inWeekDays + '</p><p class="red">\u519C\u5386:' + lunar.shengxiao + '\u5E74 ' + lunar.lnongMonth + '\u6708' + lunar.lnongDate + '</p><p>' + lunar.ganzhiYear + '\u5E74 ' + lunar.ganzhiMonth + '\u6708 ' + lunar.ganzhiDate + '\u65E5</p>';
  1088. var Fesjieri = (lunar.solarFestival || lunar.lunarFestival) != "" ? '<p class="red">' + ("\u8282\u65E5:"+lunar.solarFestival + lunar.lunarFestival) + '</p>' : "";
  1089. var Fesjieqi = lunar.jieqi != "" ? '<p class="red">'+(lunar.jieqi != "" ? "\u8282\u6C14:"+lunar.jieqi : "") + '</p>': "";
  1090. var tiptext = (lunar.solarFestival || lunar.lunarFestival || lunar.jieqi) != "" ? (Fesjieri + Fesjieqi) : "";
  1091. //生成提示框到文档中
  1092. $("body").append(tipDiv);
  1093. tipDiv.html(tiphtml + tiptext);
  1094. //获取并设置农历提示框出现的位置
  1095. var tipPos = jedfn.lunarOrien(tipDiv, _this);
  1096. tipDiv.css({"z-index": (opts.zIndex == undefined ? 10000 + 5 : opts.zIndex + 5),top:tipPos.top,left:tipPos.left,position:"absolute",display:"block"});
  1097. }).on( "mouseout", function () { //鼠标移除提示框消失
  1098. $("#jedatetipscon").remove();
  1099. });
  1100. }
  1101. };
  1102. jedfn.clickBtn = function (opts,boxCell) {
  1103. var that = this, elemCell = that.valCell,
  1104. isShow = jet.isBool(opts.isShow),
  1105. ishhmat = jet.mlen(that.format) == 7,
  1106. multiPane = jet.isBool(opts.multiPane),
  1107. isYYMM = jet.mlen(that.format) == 2,
  1108. isYY = jet.mlen(that.format) == 1;
  1109. //清空按钮清空日期时间
  1110. boxCell.on("click",".clear", function(ev) {
  1111. ev.stopPropagation();
  1112. if (isShow){
  1113. var type = jet.isValHtml(that.valCell) ? "val" : "text",
  1114. gtval = that.valCell[type](),
  1115. clearVal = that.setValue("");
  1116. that.dateClose();
  1117. if (gtval != "") {
  1118. if (jet.isBool(opts.clearRestore)){
  1119. jet.minDate = opts.startMin || jet.minDate;
  1120. jet.maxDate = opts.startMax || jet.maxDate;
  1121. }
  1122. if ($.isFunction(opts.clearfun) || opts.clearfun != null) opts.clearfun({elem:elemCell,val:clearVal});
  1123. }
  1124. }else {
  1125. var cdate = that.getValue({});
  1126. that.renderHtml(cdate[0].YYYY, cdate[0].MM,cdate[0].DD, opts,boxCell);
  1127. }
  1128. if(opts.range != false) that.delAreaAttr();
  1129. });
  1130. //今天(现在)按钮设置日期时间
  1131. if(opts.range != false) boxCell.find(".today").hide();
  1132. boxCell.on("click",".today", function() {
  1133. var xDate = new Date(),
  1134. objVal = {
  1135. YYYY:xDate.getFullYear(), MM:jet.digit(xDate.getMonth() + 1), DD:jet.digit(xDate.getDate()),
  1136. hh:jet.digit(xDate.getHours()), mm:jet.digit(xDate.getMinutes()), ss:jet.digit(xDate.getSeconds())
  1137. };
  1138. var thisdate = that.setValue(objVal);
  1139. that.dateClose();
  1140. if ($.isFunction(opts.okfun) || opts.okfun != null) opts.okfun({elem:elemCell,val:thisdate,date:objVal});
  1141. });
  1142. //确认按钮设置日期时间
  1143. boxCell.on("click",".setok", function(ev) {
  1144. ev.stopPropagation();
  1145. var sDate = new Date(),okVal,valdate,objVal;
  1146. if(opts.range == false){
  1147. var hmsVal = that.gethmsVal(boxCell),
  1148. dateVal = function () {
  1149. var ymdObj = {}, ymday = (isYYMM || isYY) ? ".ymcon":".daysul",
  1150. spval = jet.reMatch(boxCell.find(ymday).find("td.actdate").attr("je-val"));
  1151. $.each(spval,function (i,val) {
  1152. ymdObj[matArr[i]] = val;
  1153. });
  1154. var objVal = /\hh/.test(that.format) ? $.extend(ymdObj,hmsVal) : ymdObj;
  1155. return objVal;
  1156. };
  1157. okVal = ishhmat ? hmsVal : dateVal();
  1158. }else {
  1159. var newobj = {}, newarea = [], hmsArr=[[],[]];
  1160. boxCell.find(".timecon em").each(function(i) {
  1161. var disab = $(this).attr('disabled');
  1162. if(disab == undefined){
  1163. hmsArr[i>2 ? 1 : 0].push($(this).text());
  1164. }
  1165. });
  1166. if (jet.mlen(that.format) == 7){
  1167. if (opts.range != false){
  1168. $.each(hmsArr,function (i,val) {
  1169. var group = val.join("");
  1170. newobj[group] = val.join(":");
  1171. newarea.push(group);
  1172. });
  1173. }
  1174. }else {
  1175. $.each(that.areaVal, function (n, val) {
  1176. var group = val + (/\hh/.test(that.format) ? " " + hmsArr[n].join(":") : "");
  1177. var repgroup = group.replace(/\s|-|:/g, "");
  1178. newobj[repgroup] = group;
  1179. newarea.push(repgroup);
  1180. });
  1181. }
  1182. var minVal = Math.min.apply(null, newarea), maxVal = Math.max.apply(null, newarea);
  1183. okVal = newobj[minVal]+opts.range+newobj[maxVal];
  1184. }
  1185. if (isShow) {
  1186. valdate = that.setValue(okVal);
  1187. that.dateClose();
  1188. }else {
  1189. valdate = that.setValue(okVal,that.format,false);
  1190. }
  1191. if (opts.range == false){
  1192. objVal = {
  1193. YYYY:okVal.YYYY||sDate.getFullYear(), MM:jet.digit(okVal.MM||sDate.getMonth() + 1),
  1194. DD:jet.digit(okVal.DD||sDate.getDate()), hh:jet.digit(okVal.hh||sDate.getHours()),
  1195. mm:jet.digit(okVal.mm||sDate.getMinutes()), ss:jet.digit(okVal.ss||sDate.getSeconds())
  1196. };
  1197. }else {
  1198. var rans = that.setValue(okVal,that.format,false),objVal = [];
  1199. $.each(new Array(2),function (i,v) {
  1200. var tmpval = {}, spra = jet.reMatch(rans.split(opts.range)[i]);
  1201. $.each(jet.reMatch(that.format),function (r,val) {
  1202. tmpval[val]=spra[r];
  1203. });
  1204. objVal.push(tmpval);
  1205. });
  1206. }
  1207. if ($.isFunction(opts.okfun) || opts.okfun != null) opts.okfun({elem:elemCell,val:valdate,date:objVal});
  1208. });
  1209. };
  1210. jedfn.clickTime = function (opts,boxCell) {
  1211. var that = this;
  1212. if(/\hh/.test(that.format)){
  1213. var timeUl = that.maincon(".timebox",1).find("ul");
  1214. timeUl.on("click","li",function () {
  1215. var lithis = $(this);
  1216. var ulidx = lithis.parent().attr("idx"),
  1217. hmsval = lithis.text();
  1218. if (lithis.hasClass("disabled")) return;
  1219. lithis.addClass('action').siblings().removeClass('action');
  1220. boxCell.find(".timecon em").eq(ulidx).text(hmsval);
  1221. //计算当前时分秒的位置
  1222. that.locateScroll(timeUl);
  1223. });
  1224. }
  1225. };
  1226. //计算当前选中的滚动条位置
  1227. jedfn.locateScroll = function (cell) {
  1228. $.each(cell, function() {
  1229. var hmsCls = $(this), achmsCls = hmsCls.find(".action");
  1230. var acNUm = (achmsCls.length > 0) ? (achmsCls[0].offsetTop - 114):0;
  1231. hmsCls[0].scrollTop = acNUm;
  1232. });
  1233. };
  1234. //农历方位辨别
  1235. jedfn.lunarOrien = function(obj, self, pos) {
  1236. var tops, leris, ortop, orleri, rect =self[0].getBoundingClientRect();
  1237. leris = rect.right + obj[0].offsetWidth / 1.5 >= jet.docArea(1) ? rect.right - obj[0].offsetWidth : rect.left + (pos ? 0 : jet.docScroll(1));
  1238. tops = rect.bottom + obj[0].offsetHeight / 1 <= jet.docArea() ? rect.bottom - 1 : rect.top > obj[0].offsetHeight / 1.5 ? rect.top - obj[0].offsetHeight - 1 : jet.docArea() - obj[0].offsetHeight;
  1239. ortop = Math.max(tops + (pos ? 0 :jet.docScroll()) + 1, 1) + "px", orleri = leris + "px";
  1240. return {top: ortop, left: orleri }
  1241. };
  1242. //辨别控件的方位
  1243. jedfn.dateOrien = function(boxCls, valCls, pos) {
  1244. var that = this, tops, leris, ortop, orleri,
  1245. rect = that.fixed ? valCls[0].getBoundingClientRect() : boxCls[0].getBoundingClientRect(),
  1246. leris = rect.left, tops = rect.bottom;
  1247. if(that.fixed) {
  1248. var boxW = boxCls.outerWidth(), boxH = boxCls.outerHeight();
  1249. //如果右侧超出边界
  1250. if(leris + boxW > jet.docArea(true)){
  1251. leris = jet.docArea(true) - boxW;
  1252. }
  1253. //如果底部超出边界
  1254. if(tops + boxH > jet.docArea()){
  1255. tops = rect.top > boxH ? rect.top - boxH -2 : jet.docArea() - boxH -1;
  1256. }
  1257. //根据目标元素计算弹层位置
  1258. ortop = Math.max(tops + (pos ? 0 :jet.docScroll())+1, 1) + "px", orleri = leris + "px";
  1259. }else{
  1260. //弹层位置位于页面上下左右居中
  1261. ortop = "50%", orleri = "50%";
  1262. boxCls.css({"margin-top":-(rect.height / 2),"margin-left":-(rect.width / 2)});
  1263. }
  1264. boxCls.css({"top":ortop,"left":orleri});
  1265. };
  1266. jedfn.tips = function (text, time) {
  1267. var that = this, tipCls = $(jet.boxelem).find(".jedate-tips");
  1268. tipCls.html("").html(text||"").show();
  1269. clearTimeout(that.tipTime);
  1270. that.tipTime = setTimeout(function(){
  1271. tipCls.html("").hide();
  1272. }, (time||2.5)*1000);
  1273. };
  1274. //关闭层
  1275. jedfn.dateClose = function() {
  1276. if($($(jet.boxelem).attr(jefix)).length == 0) $(jet.boxelem).remove();
  1277. };
  1278. //日期大小比较
  1279. jedfn.dateContrast = function (ac, bc) {
  1280. var sarr = ac.split("-"), earr = bc.split("-"),
  1281. start = parseInt(sarr[0]+""+jet.digit(parseInt(sarr[1])-1)+""+jet.digit(sarr[2]||"01")),
  1282. end = parseInt(earr[0]+""+jet.digit(parseInt(earr[1])-1)+""+jet.digit(sarr[2]||"01"));
  1283. return (start >= end) ? false : true;
  1284. };
  1285. //删除区域属性
  1286. jedfn.delAreaAttr = function () {
  1287. delete this.areaStart;
  1288. delete this.areaEnd;
  1289. this.areaVal = [];
  1290. };
  1291. //农历数据
  1292. jedfn.jeLunar = function (ly,lm,ld) {
  1293. var lunarInfo=[19416,19168,42352,21717,53856,55632,91476,22176,39632,21970,19168,42422,42192,53840,119381,46400,54944,44450,38320,84343,18800,42160,46261,27216,27968,109396,11104,38256,21234,18800,25958,54432,59984,28309,23248,11104,100067,37600,116951,51536,54432,120998,46416,22176,107956,9680,37584,53938,43344,46423,27808,46416,86869,19872,42448,83315,21200,43432,59728,27296,44710,43856,19296,43748,42352,21088,62051,55632,23383,22176,38608,19925,19152,42192,54484,53840,54616,46400,46496,103846,38320,18864,43380,42160,45690,27216,27968,44870,43872,38256,19189,18800,25776,29859,59984,27480,21952,43872,38613,37600,51552,55636,54432,55888,30034,22176,43959,9680,37584,51893,43344,46240,47780,44368,21977,19360,42416,86390,21168,43312,31060,27296,44368,23378,19296,42726,42208,53856,60005,54576,23200,30371,38608,19415,19152,42192,118966,53840,54560,56645,46496,22224,21938,18864,42359,42160,43600,111189,27936,44448],
  1294. sTermInfo = [ 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 ];
  1295. var Gan = "甲乙丙丁戊己庚辛壬癸", Zhi = "子丑寅卯辰巳午未申酉戌亥", Animals = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
  1296. var solarTerm = [ "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满",
  1297. "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" ];
  1298. var nStr1 = "日一二三四五六七八九十", nStr2 = "初十廿卅", nStr3 = [ "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"],
  1299. sFtv1 = {
  1300. "0101" : "*1元旦节", "0202" : "湿地日",
  1301. "0214" : "情人节", "0308" : "妇女节",
  1302. "0312" : "植树节", "0315" : "消费者权益日",
  1303. "0401" : "愚人节", "0422" : "地球日",
  1304. "0501" : "*1劳动节", "0504" : "青年节",
  1305. "0512" : "护士节", "0518" : "博物馆日",
  1306. "0520" : "母亲节", "0601" : "儿童节",
  1307. "0623" : "奥林匹克日", "0630" : "父亲节",
  1308. "0701" : "建党节", "0801" : "建军节",
  1309. "0903" : "抗战胜利日", "0910" : "教师节",
  1310. "1001" : "*3国庆节", "1201" : "艾滋病日",
  1311. "1224" : "平安夜", "1225" : "圣诞节"
  1312. },
  1313. sFtv2 = {
  1314. "0100" : "除夕", "0101" : "*2春节",
  1315. "0115" : "元宵节", "0505" : "*1端午节",
  1316. "0707" : "七夕节", "0715" : "中元节",
  1317. "0815" : "*1中秋节", "0909" : "*1重阳节",
  1318. "1015" : "下元节", "1208" : "腊八节",
  1319. "1223" : "小年"
  1320. };
  1321. function flunar(Y) {
  1322. var sTerm = function (j, i) {
  1323. var h = new Date((31556925974.7 * (j - 1900) + sTermInfo[i] * 60000) + Date.UTC(1900, 0, 6, 2, 5));
  1324. return (h.getUTCDate())
  1325. },
  1326. d = function (k) {
  1327. var h, j = 348;
  1328. for (h = 32768; h > 8; h >>= 1) {
  1329. j += (lunarInfo[k - 1900] & h) ? 1 : 0;
  1330. }
  1331. return (j + b(k))
  1332. },
  1333. ymdCyl = function (h) {
  1334. return (Gan.charAt(h % 10) + Zhi.charAt(h % 12))
  1335. },
  1336. b =function (h) {
  1337. var islp = (g(h)) ? ((lunarInfo[h - 1900] & 65536) ? 30 : 29) : (0);
  1338. return islp
  1339. },
  1340. g = function (h) {
  1341. return (lunarInfo[h - 1900] & 15)
  1342. },
  1343. e = function (i, h) {
  1344. return ((lunarInfo[i - 1900] & (65536 >> h)) ? 30 : 29)
  1345. },
  1346. newymd = function (m) {
  1347. var k, j = 0, h = 0, l = new Date(1900, 0, 31), n = (m - l) / 86400000;
  1348. this.dayCyl = n + 40;
  1349. this.monCyl = 14;
  1350. for (k = 1900; k<2050&&n>0; k++) {
  1351. h = d(k); n -= h;
  1352. this.monCyl += 12;
  1353. }
  1354. if (n < 0) {
  1355. n += h; k--;
  1356. this.monCyl -= 12;
  1357. }
  1358. this.year = k;
  1359. this.yearCyl = k - 1864;
  1360. j = g(k);
  1361. this.isLeap = false;
  1362. for (k = 1; k<13&&n>0; k++) {
  1363. if (j > 0 && k == (j + 1) && this.isLeap == false) {
  1364. --k;
  1365. this.isLeap = true;
  1366. h = b(this.year);
  1367. } else {
  1368. h = e(this.year, k);
  1369. }
  1370. if (this.isLeap == true && k == (j + 1)) {
  1371. this.isLeap = false;
  1372. }
  1373. n -= h;
  1374. if (this.isLeap == false) this.monCyl++;
  1375. }
  1376. if (n == 0 && j > 0 && k == j + 1) {
  1377. if (this.isLeap) {
  1378. this.isLeap = false;
  1379. } else {
  1380. this.isLeap = true;
  1381. --k;
  1382. --this.monCyl;
  1383. }
  1384. }
  1385. if (n < 0) {
  1386. n += h; --k;
  1387. --this.monCyl
  1388. }
  1389. this.month = k;
  1390. this.day = n + 1;
  1391. },
  1392. digit = function (num) {
  1393. return num < 10 ? "0" + (num | 0) :num;
  1394. },
  1395. reymd = function (i, j) {
  1396. var h = i;
  1397. return j.replace(/dd?d?d?|MM?M?M?|yy?y?y?/g, function(k) {
  1398. switch (k) {
  1399. case "yyyy":
  1400. var l = "000" + h.getFullYear();
  1401. return l.substring(l.length - 4);
  1402. case "dd": return digit(h.getDate());
  1403. case "d": return h.getDate().toString();
  1404. case "MM": return digit((h.getMonth() + 1));
  1405. case "M": return h.getMonth() + 1;
  1406. }
  1407. })
  1408. },
  1409. lunarMD = function (i, h) {
  1410. var j;
  1411. switch (i, h) {
  1412. case 10: j = "初十"; break;
  1413. case 20: j = "二十"; break;
  1414. case 30: j = "三十"; break;
  1415. default:
  1416. j = nStr2.charAt(Math.floor(h / 10));
  1417. j += nStr1.charAt(h % 10);
  1418. }
  1419. return (j)
  1420. };
  1421. this.isToday = false;
  1422. this.isRestDay = false;
  1423. this.solarYear = reymd(Y, "yyyy");
  1424. this.solarMonth = reymd(Y, "M");
  1425. this.solarDate = reymd(Y, "d");
  1426. this.solarWeekDay = Y.getDay();
  1427. this.inWeekDays = "星期" + nStr1.charAt(this.solarWeekDay);
  1428. var X = new newymd(Y);
  1429. this.lunarYear = X.year;
  1430. this.shengxiao = Animals.charAt((this.lunarYear - 4) % 12);
  1431. this.lunarMonth = X.month;
  1432. this.lunarIsLeapMonth = X.isLeap;
  1433. this.lnongMonth = this.lunarIsLeapMonth ? "闰" + nStr3[X.month - 1] : nStr3[X.month - 1];
  1434. this.lunarDate = X.day;
  1435. this.showInLunar = this.lnongDate = lunarMD(this.lunarMonth, this.lunarDate);
  1436. if (this.lunarDate == 1) {
  1437. this.showInLunar = this.lnongMonth + "月";
  1438. }
  1439. this.ganzhiYear = ymdCyl(X.yearCyl);
  1440. this.ganzhiMonth = ymdCyl(X.monCyl);
  1441. this.ganzhiDate = ymdCyl(X.dayCyl++);
  1442. this.jieqi = "";
  1443. this.restDays = 0;
  1444. if (sTerm(this.solarYear, (this.solarMonth - 1) * 2) == reymd(Y, "d")) {
  1445. this.showInLunar = this.jieqi = solarTerm[(this.solarMonth - 1) * 2];
  1446. }
  1447. if (sTerm(this.solarYear, (this.solarMonth - 1) * 2 + 1) == reymd(Y, "d")) {
  1448. this.showInLunar = this.jieqi = solarTerm[(this.solarMonth - 1) * 2 + 1];
  1449. }
  1450. if (this.showInLunar == "清明") {
  1451. this.showInLunar = "清明节";
  1452. this.restDays = 1;
  1453. }
  1454. this.solarFestival = sFtv1[reymd(Y, "MM") + reymd(Y, "dd")];
  1455. if (typeof this.solarFestival == "undefined") {
  1456. this.solarFestival = "";
  1457. } else {
  1458. if (/\*(\d)/.test(this.solarFestival)) {
  1459. this.restDays = parseInt(RegExp.$1);
  1460. this.solarFestival = this.solarFestival.replace(/\*\d/, "");
  1461. }
  1462. }
  1463. this.showInLunar = (this.solarFestival == "") ? this.showInLunar : this.solarFestival;
  1464. this.lunarFestival = sFtv2[this.lunarIsLeapMonth ? "00" : digit(this.lunarMonth) + digit(this.lunarDate)];
  1465. if (typeof this.lunarFestival == "undefined") {
  1466. this.lunarFestival = "";
  1467. } else {
  1468. if (/\*(\d)/.test(this.lunarFestival)) {
  1469. this.restDays = (this.restDays > parseInt(RegExp.$1)) ? this.restDays : parseInt(RegExp.$1);
  1470. this.lunarFestival = this.lunarFestival.replace(/\*\d/, "");
  1471. }
  1472. }
  1473. if (this.lunarMonth == 12 && this.lunarDate == e(this.lunarYear, 12)) {
  1474. this.lunarFestival = sFtv2["0100"];
  1475. this.restDays = 1;
  1476. }
  1477. this.showInLunar = (this.lunarFestival == "") ? this.showInLunar : this.lunarFestival;
  1478. }
  1479. return new flunar(new Date(ly,lm,ld));
  1480. };
  1481. //日期控件版本
  1482. $.dateVer = "6.0.2";
  1483. //返回指定日期
  1484. $.nowDate = function (str,format) {
  1485. format = format || 'YYYY-MM-DD hh:mm:ss';
  1486. if (typeof(str) === 'number') {
  1487. str = {DD: str};
  1488. }
  1489. return jet.GetDateTime(str, format);
  1490. };
  1491. //日期时间戳相互转换
  1492. $.timeStampDate = function (date,format) {
  1493. format = format || 'YYYY-MM-DD hh:mm:ss';
  1494. var dateTest = (/^(-)?\d{1,10}$/.test(date) || /^(-)?\d{1,13}$/.test(date));
  1495. if(/^[1-9]*[1-9][0-9]*$/.test(date) && dateTest){
  1496. var vdate = parseInt(date);
  1497. if (/^(-)?\d{1,10}$/.test(vdate)) {
  1498. vdate = vdate * 1000;
  1499. } else if (/^(-)?\d{1,13}$/.test(vdate)) {
  1500. vdate = vdate * 1000;
  1501. } else if (/^(-)?\d{1,14}$/.test(vdate)) {
  1502. vdate = vdate * 100;
  1503. } else {
  1504. alert("时间戳格式不正确");
  1505. return;
  1506. }
  1507. var setdate = new Date(vdate);
  1508. return jet.parse({YYYY:setdate.getFullYear(), MM:jet.digit(setdate.getMonth()+1), DD:jet.digit(setdate.getDate()) , hh:jet.digit(setdate.getHours()), mm:jet.digit(setdate.getMinutes()), ss:jet.digit(setdate.getSeconds()) }, format);
  1509. }else {
  1510. //将日期转换成时间戳
  1511. var arrs = jet.reMatch(date),
  1512. newdate = new Date(arrs[0],parseInt(arrs[1])-1,arrs[2],arrs[3]||0,arrs[4]||0,arrs[5]||0),
  1513. timeStr = Math.round(newdate.getTime() / 1000);
  1514. return timeStr;
  1515. }
  1516. };
  1517. //分解日期时间
  1518. $.splitDate = function (str) {
  1519. var sdate = str.match(/\w+|d+/g);
  1520. return {
  1521. YYYY:parseInt(sdate[0]),MM:parseInt(sdate[1])||00,DD:parseInt(sdate[2])||00,
  1522. hh:parseInt(sdate[3])||00,mm:parseInt(sdate[4])||00,ss:parseInt(sdate[5])||00
  1523. };
  1524. };
  1525. //获取年月日星期
  1526. $.getLunar = function(date,format){
  1527. var that = this;
  1528. format = format || 'YYYY-MM-DD hh:mm:ss';
  1529. if(/YYYY-MM-DD/g.test(jet.isparmat(format))){
  1530. //如果为数字类型的日期对获取到日期的进行替换
  1531. var charDate = date.substr(0,4).replace(/^(\d{4})/g,"$1,") + date.substr(4).replace(/(.{2})/g,"$1,"),
  1532. reArr = jet.isNum(date) ? jet.reMatch(charDate) : jet.reMatch(date),
  1533. lunars = that.jeLunar(reArr[0], reArr[1] - 1, reArr[2]);
  1534. return{
  1535. nMonth: lunars.lnongMonth, //农历月
  1536. nDays: lunars.lnongDate, //农历日
  1537. yYear: parseInt(lunars.solarYear), //阳历年
  1538. yMonth: parseInt(lunars.solarMonth), //阳历月
  1539. yDays: parseInt(lunars.solarDate), //阳历日
  1540. cWeek: lunars.inWeekDays, //汉字星期几
  1541. nWeek: lunars.solarWeekDay //数字星期几
  1542. };
  1543. }
  1544. };
  1545. return jeDate;
  1546. });