calendar.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. function c$(sId) {
  2. if (sId == "") return null;
  3. return document.getElementById(sId);
  4. }
  5. function cnCalendar() {
  6. var _calendar_obj = null;
  7. var outfunc = null;
  8. var reciever;
  9. var curDate = null;
  10. var startDate = null;
  11. var endDate = null;
  12. var today = new Date();
  13. var y = today.getFullYear();
  14. var m = today.getMonth() + 1;
  15. this.daysInMonth = function(y, m)
  16. {
  17. switch (m)
  18. {
  19. case 1:
  20. case 3:
  21. case 5:
  22. case 7:
  23. case 8:
  24. case 10:
  25. case 12:
  26. return 31;
  27. case 4:
  28. case 6:
  29. case 9:
  30. case 11:
  31. return 30;
  32. case 2:
  33. if (y % 4 != 0)
  34. {
  35. return 28;
  36. }
  37. if (y % 100 == 0)
  38. {
  39. return y % 400 == 0 ? 29 : 28;
  40. }
  41. return 29;
  42. }
  43. }
  44. //Generate Codes
  45. this.generateCalendarTable = function() {
  46. var gy, gm, gd;
  47. if (reciever.value) {
  48. var sDate = new Date(Date.parse(reciever.value.replace(/-/g, "/")));
  49. gy = sDate.getFullYear();
  50. gm = sDate.getMonth() + 1;
  51. gd = sDate.getDate();
  52. }
  53. var i;
  54. var j = new Date(y, m - 1, 1).getDay();
  55. var k = this.daysInMonth(y, m);
  56. var body = '';
  57. //Frame Table Header
  58. body += "<table class='calendar_table' cellpadding='0' cellspacing='1' author=\"outclick\">";
  59. body += " <tr>";
  60. body += " <td colspan='7' style='padding-bottom:0px' author=\"outclick\">";
  61. body += " <table class='calendar_caption' author=\"outclick\">";
  62. body += " <tr>";
  63. body += " <td author=\"outclick\"><a href='javascript:calendar.loadPreviousYear()' class=\"calendar_nav navleft2\" author=\"outclick\"></a><a href='javascript:calendar.loadPreviousMonth()' class=\"calendar_nav navleft\" author=\"outclick\"></a></td>";
  64. body += " <td author=\"outclick\" align='center' nowrap='nowrap' ><span id=\"spanCYear\" onclick=\"calendar.changeYearMonth(this,'year')\" author=\"outclick\" date=\"year\">" + y + "年</span><span date=\"year\" author=\"outclick\" id=\"changeCYear\" style=\"display:none;\"></span><span id=\"changeCMonth\" date=\"year\" author=\"outclick\" style=\"display:none;\"></span><span id=\"spanCMonth\" onclick=\"calendar.changeYearMonth(this,'month')\" date=\"year\" author=\"outclick\">" + m + "月</span></td>";
  65. body += " <td author=\"outclick\"><a author=\"outclick\" class=\"calendar_nav navright\" href='javascript:calendar.loadNextMonth()'></a><a author=\"outclick\" class=\"calendar_nav navright2\" href='javascript:calendar.loadNextYear()'></a></td>";
  66. body += " </tr>";
  67. body += " </table>";
  68. body += " </td>";
  69. body += " </tr>";
  70. //Calendar Table Header
  71. body += " <tr class='calendar_header' >";
  72. body += " <td author=\"outclick\">日</td>";
  73. body += " <td author=\"outclick\">一</td>";
  74. body += " <td author=\"outclick\">二</td>";
  75. body += " <td author=\"outclick\">三</td>";
  76. body += " <td author=\"outclick\">四</td>";
  77. body += " <td author=\"outclick\">五</td>";
  78. body += " <td author=\"outclick\">六</td>";
  79. body += " </tr>";
  80. if (j != 0) {
  81. body += "<tr align='center'>";
  82. body += ("<td author=\"outclick\" colspan='" + j + "'></td>");
  83. }
  84. for (i = 1; i <= k; i++) {
  85. if ((i + j) % 7 == 1) {
  86. body += "<tr align='center'>";
  87. }
  88. body += "<td author=\"outclick\"";
  89. if (this.disabledDate(y, m, i)) {
  90. body += " class=\"calendar_day disabled_css\" ";
  91. } else {
  92. if (y == today.getFullYear() && m == today.getMonth() + 1 && i == today.getDate()) {//等于当天
  93. body += " class=\"calendar_day today_css\" ";
  94. }
  95. else if ((y + "-" + m + "-" + i) == (gy + "-" + gm + "-" + gd)) {//选中的时间
  96. body += " class=\"calendar_day currentday_css\" ";
  97. }
  98. else {
  99. body += " class=\"calendar_day out_css\" ";
  100. }
  101. body += " onmouseover=\"if(this.className=='calendar_day out_css' )this.className='calendar_day over_css';\"";
  102. body += " onmouseout=\"if(this.className=='calendar_day over_css'){this.className='calendar_day out_css'}\"";
  103. body += " onclick=\"calendar.setValue('" + y + "-" + this.getZeroNum(m) + "-" + this.getZeroNum(i) + "')\"";
  104. }
  105. body += ">" + i + "</td>";
  106. if ((i + j) % 7 == 0) {
  107. body += ("</tr>");
  108. }
  109. }
  110. if ((i + j) % 7 != 0) {
  111. body += ("<td author=\"outclick\" colspan='" + (8 - (i + j) % 7) + "'></td>");
  112. body += ("</tr>");
  113. }
  114. if (j < (36 - k)) {
  115. body += ("<tr><td author=\"outclick\" colspan='7' >&nbsp;</td></tr>");
  116. }
  117. if (j == 0 && k == 28) {
  118. body += ("<tr><td author=\"outclick\" colspan='7' >&nbsp;</td></tr>");
  119. }
  120. body += "<tr><td colspan='7' author=\"outclick\" style='text-align:center;height:20px;padding:2 0 2 0'><a class=\"calendar_button\" href=\"javascript:calendar.toDay()\">今天</a>&nbsp;&nbsp;<a class=\"calendar_button\" href=\"javascript:calendar.setValue('')\">清空</a></td></tr>"
  121. body += "</table>";
  122. return body;
  123. }
  124. this.loadPreviousYear = function()
  125. {
  126. y--;
  127. _calendar_obj.innerHTML = this.generateCalendarTable();
  128. }
  129. this.loadNextYear = function()
  130. {
  131. y++;
  132. _calendar_obj.innerHTML = this.generateCalendarTable();
  133. }
  134. this.loadPreviousMonth = function()
  135. {
  136. m--;
  137. if (m < 1){m = 12;y--;}
  138. _calendar_obj.innerHTML = this.generateCalendarTable();
  139. }
  140. this.loadNextMonth = function()
  141. {
  142. m++;
  143. if (m > 12)
  144. {
  145. m = 1;
  146. y++;
  147. }
  148. _calendar_obj.innerHTML = this.generateCalendarTable();
  149. }
  150. this.changeYear = function(year) {
  151. y = parseInt(year.replace("年", ""));
  152. _calendar_obj.innerHTML = this.generateCalendarTable();
  153. }
  154. this.changeMonth = function(month) {
  155. m = parseInt(month.replace("月", ""));
  156. _calendar_obj.innerHTML = this.generateCalendarTable();
  157. }
  158. this.getAbsolutePosition = function(element)
  159. {
  160. var point = { x: element.offsetLeft, y: element.offsetTop };
  161. if (element.offsetParent)
  162. {
  163. var parentPoint = this.getAbsolutePosition(element.offsetParent);
  164. point.x += parentPoint.x;
  165. point.y += parentPoint.y;
  166. }
  167. return point;
  168. };
  169. this.initValue = function(isCur, start, end) {
  170. curDate = null;
  171. startDate = null;
  172. endDate = null;
  173. if (isCur) curDate = new Date();
  174. if (start != "" && $(start) && c$(start).value != "") startDate = new Date(Date.parse(c$(start).value.replace(/-/g, "/")));
  175. if (end != "" && $(end) && c$(end).value != "") endDate = new Date(Date.parse(c$(end).value.replace(/-/g, "/")));
  176. }
  177. this.disabledDate = function(my, mm, md) {
  178. var sTime = new Date(my, mm - 1, md);
  179. var bl = false;
  180. if (curDate != null && sTime < curDate) return true;
  181. if (startDate != null && sTime < startDate) return true;
  182. if (endDate != null && sTime > endDate) return true;
  183. return bl;
  184. }
  185. this.setHook = function (obj, isCur, start, end, func) {
  186. var dateField = obj.previousSibling;
  187. if (dateField.disabled) return;
  188. reciever = dateField;
  189. if (func) outfunc = func;
  190. this.initValue(isCur, start, end);
  191. _calendar_obj = c$("calendar_div")
  192. if (!_calendar_obj) {
  193. var divObj = document.createElement("div");
  194. divObj.id = "calendar_div";
  195. divObj.style.position = "absolute";
  196. divObj.style.styleFloat = "left";
  197. divObj.style.display = "none";
  198. divObj.style.zIndex = "999999";
  199. document.body.appendChild(divObj);
  200. _calendar_obj = divObj;
  201. }
  202. //没有隐藏则隐藏
  203. if (_calendar_obj.style.display != 'none' && reciever == dateField) {
  204. _calendar_obj.style.display = 'none';
  205. return;
  206. }
  207. //定位
  208. var point = this.getAbsolutePosition(dateField);
  209. var cw = 192;
  210. var allw = document.body.offsetWidth;
  211. var lx = point.x + dateField.offsetWidth;
  212. if (lx + cw > allw) {
  213. lx = lx - cw;
  214. }
  215. _calendar_obj.style.left = lx + 'px';
  216. _calendar_obj.style.top = point.y + 10 + 'px';
  217. //有值
  218. if (reciever.value) {
  219. var tmpDate = new Date(Date.parse(reciever.value.replace(/-/g, "/")));
  220. y = tmpDate.getFullYear();
  221. m = tmpDate.getMonth() + 1;
  222. }
  223. _calendar_obj.innerHTML = this.generateCalendarTable();
  224. _calendar_obj.style.display = "";
  225. }
  226. this.fadeOut = function () {
  227. if (_calendar_obj) {
  228. _calendar_obj.style.display = 'none';
  229. }
  230. }
  231. this.toDay = function() {
  232. var date = GetCurDate();
  233. reciever.value = date.getFullYear() + "-" + this.getZeroNum(date.getMonth() + 1) + "-" + this.getZeroNum(date.getDate());
  234. if (outfunc)eval(outfunc);
  235. this.fadeOut();
  236. }
  237. this.setValue = function(date) {
  238. reciever.value = date;
  239. if (outfunc) eval(outfunc);
  240. this.fadeOut();
  241. }
  242. this.getZeroNum = function(mon) {
  243. if (mon < 10) return "0"+mon;
  244. else return mon;
  245. }
  246. this.changeYearMonth = function(obj, sType) {
  247. obj.style.display = "none";
  248. var str = obj.innerHTML;
  249. if (sType == "year") {
  250. c$("changeCMonth").style.display = "none";
  251. c$("changeCYear").style.display = "";
  252. c$("spanCMonth").style.display = "";
  253. if (c$("changeCYear").innerHTML == "") {
  254. var yearObj = document.createElement("select");
  255. yearObj.setAttribute("author", "outclick");
  256. yearObj.setAttribute("date", "year");
  257. if (yearObj.addEventListener) {
  258. yearObj.addEventListener("change", function(e) { changeValueCalendar(this, "year") }, false);
  259. } else {
  260. yearObj.attachEvent("onchange", function(e) { changeValueCalendar(yearObj, "year") }, false);
  261. }
  262. var i = 0;
  263. for (yNum = 1949; yNum <= 2050; yNum++) {
  264. var opt = new Option(yNum + "年", yNum + "年");
  265. opt.setAttribute("author", "outclick");
  266. opt.setAttribute("date", "month");
  267. yearObj.options.add(opt);
  268. if (str.indexOf(yNum) != -1)
  269. yearObj.selectedIndex = i;
  270. i++;
  271. }
  272. c$("changeCYear").appendChild(yearObj);
  273. }
  274. else {
  275. var ci = 0;
  276. for (var yNum = 1949; yNum <= 2050; yNum++) {
  277. if (str.indexOf(yNum) != -1) {
  278. c$("changeCYear").childNodes[0].selectedIndex = ci;
  279. break;
  280. }
  281. ci++;
  282. }
  283. }
  284. } else {
  285. c$("changeCYear").style.display = "none";
  286. c$("changeCMonth").style.display = "";
  287. c$("spanCYear").style.display = "";
  288. if (c$("changeCMonth").innerHTML == "") {
  289. var monthObj = document.createElement("select");
  290. monthObj.setAttribute("author", "outclick");
  291. monthObj.setAttribute("date", "month");
  292. if (monthObj.addEventListener) {
  293. monthObj.addEventListener("change", function() { changeValueCalendar(this, "month") }, false);
  294. } else {
  295. monthObj.attachEvent("onchange", function() { changeValueCalendar(monthObj, "month") }, false);
  296. }
  297. for (var mNum = 1; mNum <= 12; mNum++) {
  298. var mopt = new Option(mNum + "月", mNum + "月");
  299. mopt.setAttribute("author", "outclick");
  300. mopt.setAttribute("date", "month");
  301. monthObj.options.add(mopt);
  302. if (str.indexOf(mNum + "月") != -1) {
  303. monthObj.selectedIndex = mNum - 1;
  304. }
  305. }
  306. c$("changeCMonth").appendChild(monthObj);
  307. }
  308. else {
  309. for (var cmNum = 1; cmNum <= 12; cmNum++) {
  310. if (str.indexOf(cmNum + '月') != -1)
  311. monthObj.selectedIndex = cmNum;
  312. }
  313. }
  314. }
  315. }
  316. }
  317. function changeValueCalendar(obj, sType) {
  318. if(sType=="year"){
  319. c$("spanCYear").innerHTML=obj.value;
  320. c$("spanCYear").style.display = "";
  321. c$("changeCYear").style.display = "none";
  322. calendar.changeYear(obj.value);
  323. } else {
  324. c$("spanCMonth").innerHTML=obj.value;
  325. c$("spanCMonth").style.display = "";
  326. c$("changeCMonth").style.display = "none";
  327. calendar.changeMonth(obj.value);
  328. }
  329. }
  330. function hideCalendar(event) {
  331. event = (event == null) ? window.event : event;
  332. var srcelement = event.target ? event.target : event.srcElement;
  333. if (srcelement.getAttribute("author") != null && srcelement.getAttribute("date")==null) {
  334. if (c$("changeCYear").style.display == "") {
  335. c$("spanCYear").style.display = "";
  336. c$("changeCYear").style.display = "none";
  337. }
  338. if (c$("changeCMonth").style.display == "") {
  339. c$("spanCMonth").style.display = "";
  340. c$("changeCMonth").style.display = "none";
  341. }
  342. }else {
  343. if (srcelement.getAttribute("author") == null && srcelement.className.indexOf("shortbtn") == -1) {
  344. calendar.fadeOut();
  345. }
  346. }
  347. }
  348. var calendar = new cnCalendar();
  349. window.onload = function() {
  350. if (document.addEventListener) {
  351. document.addEventListener("click", function(e) { hideCalendar(e) }, false);
  352. } else {
  353. document.attachEvent("onclick", function(e) { hideCalendar(e) }, false);
  354. }
  355. }