PageRenderTime 181ms CodeModel.GetById 26ms RepoModel.GetById 2ms app.codeStats 0ms

/js/calendar.js

https://github.com/masir/ucs-2.0
JavaScript | 280 lines | 209 code | 20 blank | 51 comment | 57 complexity | 2c403cced851cc8d2016dc00a6206cce MD5 | raw file
  1. /**
  2. * Arie Nugraha 2009
  3. * this file need prototype. js
  4. * library to works
  5. *
  6. * Modification of phpMyAdmin's calendar library
  7. */
  8. var calendarPop;
  9. var dateField;
  10. var calContainer;
  11. var dateType = 'datetime';
  12. var day;
  13. var month;
  14. var year;
  15. var hour;
  16. var minute;
  17. var second;
  18. var month_names = new Array('January', 'February', 'March', 'April',
  19. 'May', 'June', 'July', 'August', 'September',
  20. 'October', 'November', 'December');
  21. var day_names = new Array('Sun', 'Mon', 'Tue', 'Wed',
  22. 'Thu', 'Fri', 'Sat');
  23. /**
  24. * Open Calendar Window
  25. */
  26. function openCalendar(strDatefieldID) {
  27. if (calendarPop) {
  28. calendarPop.show();
  29. } else {
  30. // inject calendar container to body
  31. $(document.body).append('<div style="width: 300px;" id="calendarPop">'
  32. + '<div style="float: left; width: 70%">Calendar</div>'
  33. + '<div style="float: right; width: 20%; text-align: right;">'
  34. + '<a style="color: red; font-weight: bold; cursor: pointer;" onclick="calendarPop.hide()">Close</a>'
  35. + '</div>'
  36. + '<div id="calendarContainer">&nbsp;</div>'
  37. + '<div id="clockContainer">&nbsp;</div>'
  38. + '</div>');
  39. // positionize
  40. calendarPop = $('#calendarPop');
  41. }
  42. // date input field
  43. dateField = $('#'+strDatefieldID);
  44. // get date input position
  45. var dateFieldPos = dateField.offset();
  46. calendarPop.css({'position': 'absolute', 'left': (dateFieldPos.left-2)+'px', 'top': (dateFieldPos.top-2)+'px'});
  47. // reset all time value
  48. day = 0; month = 0; year = 0;
  49. // initialize calendar
  50. initCalendar();
  51. }
  52. /**
  53. * Formats number to two digits.
  54. *
  55. * @param int number to format.
  56. * @param string type of number
  57. */
  58. var formatNum2 = function(i, valtype) {
  59. f = (i < 10 ? '0' : '') + i;
  60. if (valtype && valtype != '') {
  61. switch(valtype) {
  62. case 'month':
  63. f = (f > 12 ? 12 : f);
  64. break;
  65. case 'day':
  66. f = (f > 31 ? 31 : f);
  67. break;
  68. case 'hour':
  69. f = (f > 24 ? 24 : f);
  70. break;
  71. default:
  72. case 'second':
  73. case 'minute':
  74. f = (f > 59 ? 59 : f);
  75. break;
  76. }
  77. }
  78. return f;
  79. }
  80. /**
  81. * Formats number to two digits.
  82. *
  83. * @param int number to format.
  84. * @param int default value
  85. * @param string type of number
  86. */
  87. var formatNum2d = function(i, default_v, valtype) {
  88. i = parseInt(i, 10);
  89. if (isNaN(i)) return default_v;
  90. return formatNum2(i, valtype)
  91. }
  92. /**
  93. * Formats number to four digits.
  94. *
  95. * @param int number to format.
  96. */
  97. var formatNum4 = function(i) {
  98. i = parseInt(i, 10)
  99. return (i < 1000 ? i < 100 ? i < 10 ? '000' : '00' : '0' : '') + i;
  100. }
  101. /**
  102. * open calendar window.
  103. *
  104. */
  105. var initCalendar = function() {
  106. var dateFieldValue = dateField.val();
  107. /* Called for first time */
  108. if (!year && !month && !day) {
  109. if (dateFieldValue) {
  110. if (dateType == 'datetime' || dateType == 'date') {
  111. if (dateType == 'datetime') {
  112. var parts = dateFieldValue.split(' ');
  113. dateFieldValue = parts[0];
  114. if (parts[1]) {
  115. time = parts[1].split(':');
  116. hour = parseInt(time[0],10);
  117. minute = parseInt(time[1],10);
  118. second = parseInt(time[2],10);
  119. }
  120. }
  121. date = dateFieldValue.split("-");
  122. day = parseInt(date[2],10);
  123. month = parseInt(date[1],10) - 1;
  124. year = parseInt(date[0],10);
  125. } else {
  126. year = parseInt(dateFieldValue.substr(0,4),10);
  127. month = parseInt(dateFieldValue.substr(4,2),10) - 1;
  128. day = parseInt(dateFieldValue.substr(6,2),10);
  129. hour = parseInt(dateFieldValue.substr(8,2),10);
  130. minute = parseInt(dateFieldValue.substr(10,2),10);
  131. second = parseInt(dateFieldValue.substr(12,2),10);
  132. }
  133. }
  134. if (isNaN(year) || isNaN(month) || isNaN(day) || day == 0) {
  135. dt = new Date();
  136. year = dt.getFullYear();
  137. month = dt.getMonth();
  138. day = dt.getDate();
  139. }
  140. if (isNaN(hour) || isNaN(minute) || isNaN(second)) {
  141. dt = new Date();
  142. hour = dt.getHours();
  143. minute = dt.getMinutes();
  144. second = dt.getSeconds();
  145. }
  146. }
  147. /* Moving in calendar */
  148. if (month > 11) {
  149. month = 0;
  150. year++;
  151. }
  152. if (month < 0) {
  153. month = 11;
  154. year--;
  155. }
  156. // calendar container
  157. calContainer = $('#calendarContainer');
  158. var strTable = ""
  159. //heading table
  160. strTable += '<table class="calendar monthyearselect"><tr><th width="50%">';
  161. strTable += '<form method="NONE" onsubmit="return 0">';
  162. strTable += '<a href="javascript:month--; initCalendar();">&laquo;</a> ';
  163. strTable += '<select id="select_month" name="monthsel" onchange="month = parseInt($(\'#select_month\').val()); initCalendar();">';
  164. for (i =0; i < 12; i++) {
  165. if (i == month) selected = ' selected="selected"';
  166. else selected = '';
  167. strTable += '<option value="' + i + '" ' + selected + '>' + month_names[i] + '</option>';
  168. }
  169. strTable += '</select>';
  170. strTable += ' <a href="javascript:month++; initCalendar();">&raquo;</a>';
  171. strTable += '</form>';
  172. strTable += '</th><th width="50%">';
  173. strTable += '<form method="none" onsubmit="return 0">';
  174. strTable += '<a href="javascript:year--; initCalendar();">&laquo;</a> ';
  175. strTable += '<select id="select_year" name="yearsel" onchange="year = parseInt($(\'#select_year\').val()); initCalendar();">';
  176. for (i = year - 25; i < year + 25; i++) {
  177. if (i == year) selected = ' selected="selected"';
  178. else selected = '';
  179. strTable += '<option value="' + i + '" ' + selected + '>' + i + '</option>';
  180. }
  181. strTable += '</select>';
  182. strTable += ' <a href="javascript:year++; initCalendar();">&raquo;</a>';
  183. strTable += '</form>';
  184. strTable += '</th></tr></table>';
  185. strTable += '<table class="calendar"><tr>';
  186. for (i = 0; i < 7; i++) {
  187. strTable += "<th>" + day_names[i] + "</th>";
  188. }
  189. strTable += "</tr>";
  190. var firstDay = new Date(year, month, 1).getDay();
  191. var lastDay = new Date(year, month + 1, 0).getDate();
  192. strTable += "<tr>";
  193. dayInWeek = 0;
  194. for (i = 0; i < firstDay; i++) {
  195. strTable += "<td>&nbsp;</td>";
  196. dayInWeek++;
  197. }
  198. for (i = 1; i <= lastDay; i++) {
  199. if (dayInWeek == 7) {
  200. strTable += "</tr><tr>";
  201. dayInWeek = 0;
  202. }
  203. dispmonth = 1 + month;
  204. if (dateType == 'datetime' || dateType == 'date') {
  205. actVal = "" + formatNum4(year) + "-" + formatNum2(dispmonth, 'month') + "-" + formatNum2(i, 'day');
  206. } else {
  207. actVal = "" + formatNum4(year) + formatNum2(dispmonth, 'month') + formatNum2(i, 'day');
  208. }
  209. if (i == day) {
  210. style = ' class="selected"';
  211. current_date = actVal;
  212. } else {
  213. style = '';
  214. }
  215. strTable += "<td" + style + "><a href=\"javascript:returnDate('" + actVal + "');\">" + i + "</a></td>"
  216. dayInWeek++;
  217. }
  218. for (i = dayInWeek; i < 7; i++) {
  219. strTable += "<td>&nbsp;</td>";
  220. }
  221. strTable += "</tr></table>";
  222. calContainer.html(strTable);
  223. if (dateType == 'datetime') {
  224. // clock
  225. var clockContainer = $('#clockContainer');
  226. strTable = '';
  227. init_hour = hour;
  228. init_minute = minute;
  229. init_second = second;
  230. strTable += '<form method="none" class="clock" onsubmit="returnDate(\'' + current_date + '\')">';
  231. strTable += '<input id="hour" type="text" size="2" maxlength="2" onblur="this.value=formatNum2d(this.value, init_hour, \'hour\'); init_hour = this.value;" value="' + formatNum2(hour, 'hour') + '" />:';
  232. strTable += '<input id="minute" type="text" size="2" maxlength="2" onblur="this.value=formatNum2d(this.value, init_minute, \'minute\'); init_minute = this.value;" value="' + formatNum2(minute, 'minute') + '" />:';
  233. strTable += '<input id="second" type="text" size="2" maxlength="2" onblur="this.value=formatNum2d(this.value, init_second, \'second\'); init_second = this.value;" value="' + formatNum2(second, 'second') + '" />';
  234. strTable += '</form>';
  235. clockContainer.html(strTable);
  236. }
  237. }
  238. /**
  239. * Returns date from calendar.
  240. *
  241. * @param string date text
  242. */
  243. function returnDate(d) {
  244. txt = d;
  245. if (dateType != 'date') {
  246. // need to get time
  247. h = parseInt($('#hour').val(),10);
  248. m = parseInt($('#minute').val(),10);
  249. s = parseInt($('#second').val(),10);
  250. if (dateType == 'datetime') {
  251. txt += ' ' + formatNum2(h, 'hour') + ':' + formatNum2(m, 'minute') + ':' + formatNum2(s, 'second');
  252. } else {
  253. // timestamp
  254. txt += formatNum2(h, 'hour') + formatNum2(m, 'minute') + formatNum2(s, 'second');
  255. }
  256. }
  257. dateField.val(txt);
  258. // close calendar window
  259. calendarPop.hide();
  260. }