You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

322 lines
9.0 KiB

  1. // Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
  2. //
  3. // MIT License (MIT)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a
  6. // copy of this software and associated documentation files (the "Software"),
  7. // to deal in the Software without restriction, including without limitation
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. // and/or sell copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  16. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17. // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
  19. // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  20. // OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. //
  22. // Date
  23. function same_day(d1, d2) {
  24. if(d1.getFullYear()==d2.getFullYear() && d1.getMonth()==d2.getMonth() && d1.getDate()==d2.getDate())return true; else return false;
  25. }
  26. var month_list = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  27. var month_last = {1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
  28. var month_list_full = ['January','February','March','April','May','June','July','August','September','October','November','December'];
  29. var week_list = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
  30. var week_list_full = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
  31. function int_to_str(i, len) {
  32. i = ''+i;
  33. if(i.length<len)for(c=0;c<(len-i.length);c++)i='0'+i;
  34. return i
  35. }
  36. wn.datetime = {
  37. str_to_obj: function(d) {
  38. if(typeof d=="object") return d;
  39. if(!d) return new Date();
  40. var tm = [null, null];
  41. if(d.search(' ')!=-1) {
  42. var tm = d.split(' ')[1].split(':');
  43. var d = d.split(' ')[0];
  44. }
  45. if(d.search('-')!=-1) {
  46. var t = d.split('-'); return new Date(t[0],t[1]-1,t[2],tm[0],tm[1]);
  47. } else if(d.search('/')!=-1) {
  48. var t = d.split('/'); return new Date(t[0],t[1]-1,t[2],tm[0],tm[1]);
  49. } else {
  50. return new Date();
  51. }
  52. },
  53. obj_to_str: function(d) {
  54. if(typeof d=='string') return d;
  55. return d.getFullYear() + '-' + int_to_str(d.getMonth()+1,2) + '-' + int_to_str(d.getDate(),2);
  56. },
  57. obj_to_user: function(d) {
  58. return dateutil.str_to_user(dateutil.obj_to_str(d));
  59. },
  60. get_diff: function(d1, d2) {
  61. if(typeof d1=='string') d1 = dateutil.str_to_obj(d1);
  62. if(typeof d2=='string') d2 = dateutil.str_to_obj(d2);
  63. return Math.round((d1-d2) / 86400000);
  64. },
  65. get_day_diff: function(d1, d2) {
  66. return dateutil.get_diff(new Date(d1.getYear(), d1.getMonth(), d1.getDate(), 0, 0),
  67. new Date(d2.getYear(), d2.getMonth(), d2.getDate(), 0, 0))
  68. },
  69. add_days: function(d, days) {
  70. var dt = dateutil.str_to_obj(d);
  71. var new_dt = new Date(dt.getTime()+(days*24*60*60*1000));
  72. return dateutil.obj_to_str(new_dt);
  73. },
  74. add_months: function(d, months) {
  75. dt = dateutil.str_to_obj(d)
  76. new_dt = new Date(dt.getFullYear(), dt.getMonth()+months, dt.getDate())
  77. if(new_dt.getDate() != dt.getDate()) {
  78. // month has changed, go the last date of prev month
  79. return dateutil.month_end(new Date(dt.getFullYear(), dt.getMonth()+months, 1))
  80. }
  81. return dateutil.obj_to_str(new_dt);
  82. },
  83. month_start: function() {
  84. var d = new Date();
  85. return d.getFullYear() + '-' + int_to_str(d.getMonth()+1,2) + '-01';
  86. },
  87. month_end: function(d) {
  88. if(!d)var d = new Date();
  89. var m = d.getMonth() + 1;
  90. var y = d.getFullYear();
  91. last_date = month_last[m];
  92. if(m==2 && (y % 4)==0 && ((y % 100)!=0 || (y % 400)==0)) // leap year test
  93. last_date = 29;
  94. return y+'-'+int_to_str(m,2)+'-'+last_date;
  95. },
  96. get_user_fmt: function() {
  97. var t = sys_defaults.date_format;
  98. if(!t) t = 'dd-mm-yyyy';
  99. return t;
  100. },
  101. str_to_user: function(val, no_time_str) {
  102. var user_fmt = dateutil.get_user_fmt();
  103. var time_str = '';
  104. if(val==null||val=='')return null;
  105. // separate time string if there
  106. if(val.search(' ')!=-1) {
  107. var tmp = val.split(' ');
  108. if(tmp[1])
  109. time_str = ' ' + tmp[1];
  110. var d = tmp[0];
  111. } else {
  112. var d = val;
  113. }
  114. if(no_time_str)time_str = '';
  115. // set to user fmt
  116. d = d.split('-');
  117. if(d.length==3) {
  118. if(user_fmt=='dd-mm-yyyy')
  119. val = d[2]+'-'+d[1]+'-'+d[0] + time_str;
  120. else if(user_fmt=='dd/mm/yyyy')
  121. val = d[2]+'/'+d[1]+'/'+d[0] + time_str;
  122. else if(user_fmt=='yyyy-mm-dd')
  123. val = d[0]+'-'+d[1]+'-'+d[2] + time_str;
  124. else if(user_fmt=='mm/dd/yyyy')
  125. val = d[1]+'/'+d[2]+'/'+d[0] + time_str;
  126. else if(user_fmt=='mm-dd-yyyy')
  127. val = d[1]+'-'+d[2]+'-'+d[0] + time_str;
  128. }
  129. return val;
  130. },
  131. full_str: function() {
  132. var d = new Date();
  133. return d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate() + ' '
  134. + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
  135. },
  136. user_to_str: function(d) {
  137. var user_fmt = this.get_user_fmt();
  138. var time_str = '';
  139. if (d.search(/ /)!=-1) {
  140. time_str = " " + d.split(" ")[1];
  141. d = d.split(" ")[0];
  142. }
  143. if(user_fmt=='dd-mm-yyyy') {
  144. var d = d.split('-');
  145. var val = d[2]+'-'+d[1]+'-'+d[0];
  146. }
  147. else if(user_fmt=='dd/mm/yyyy') {
  148. var d = d.split('/');
  149. var val = d[2]+'-'+d[1]+'-'+d[0];
  150. }
  151. else if(user_fmt=='yyyy-mm-dd') {
  152. var val = d;
  153. }
  154. else if(user_fmt=='mm/dd/yyyy') {
  155. var d = d.split('/');
  156. var val = d[2]+'-'+d[0]+'-'+d[1];
  157. }
  158. else if(user_fmt=='mm-dd-yyyy') {
  159. var d = d.split('-');
  160. var val = d[2]+'-'+d[0]+'-'+d[1];
  161. }
  162. return val + time_str;
  163. },
  164. user_to_obj: function(d) {
  165. return dateutil.str_to_obj(dateutil.user_to_str(d));
  166. },
  167. global_date_format: function(d) {
  168. if(d.substr) d = this.str_to_obj(d);
  169. return nth(d.getDate()) + ' ' + month_list_full[d.getMonth()] + ' ' + d.getFullYear();
  170. },
  171. get_today: function() {
  172. var today = new Date();
  173. var m = (today.getMonth()+1)+'';
  174. if(m.length==1)m='0'+m;
  175. var d = today.getDate()+'';
  176. if(d.length==1)d='0'+d;
  177. return today.getFullYear()+'-'+m+'-'+d;
  178. },
  179. get_cur_time: function() {
  180. // returns current time in hh:mm string
  181. var d = new Date();
  182. var hh = d.getHours() + ''
  183. var mm = cint(d.getMinutes()/5)*5 + ''
  184. return (hh.length==1 ? '0'+hh : hh) + ':' + (mm.length==1 ? '0'+mm : mm);
  185. }
  186. }
  187. wn.datetime.only_date = function(val) {
  188. if(val==null||val=='')return null;
  189. if(val.search(':')!=-1) {
  190. var tmp = val.split(' ');
  191. var d = tmp[0].split('-');
  192. } else {
  193. var d = val.split('-');
  194. }
  195. if(d.length==3)
  196. val = d[2]+'-'+d[1]+'-'+d[0];
  197. return val;
  198. }
  199. // Time
  200. wn.datetime.time_to_ampm = function(v) {
  201. if(!v) {
  202. var d = new Date();
  203. var t = [d.getHours(), cint(d.getMinutes()/5)*5 + '']
  204. } else {
  205. var t = v.split(':');
  206. }
  207. if(t.length!=2){
  208. show_alert('[set_time] Incorect time format');
  209. return;
  210. }
  211. if(t[1].length==1) t[1]='0' + t[1];
  212. if(cint(t[0]) == 0) var ret = ['12', t[1], 'AM'];
  213. else if(cint(t[0]) < 12) var ret = [cint(t[0]) + '', t[1], 'AM'];
  214. else if(cint(t[0]) == 12) var ret = ['12', t[1], 'PM'];
  215. else var ret = [(cint(t[0]) - 12) + '', t[1], 'PM'];
  216. return ret;
  217. }
  218. wn.datetime.time_to_hhmm = function(hh,mm,am) {
  219. if(am == 'AM' && hh=='12') {
  220. hh = '00';
  221. } else if(am == 'PM' && hh!='12') {
  222. hh = cint(hh) + 12;
  223. }
  224. if(!mm) mm='00';
  225. if(!hh) hh='00';
  226. return hh + ':' + mm;
  227. }
  228. /*
  229. * JavaScript Pretty Date
  230. * Copyright (c) 2011 John Resig (ejohn.org)
  231. * Licensed under the MIT and GPL licenses.
  232. */
  233. // Takes an ISO time and returns a string representing how
  234. // long ago the date represents.
  235. function prettyDate(time){
  236. if(!time) return ''
  237. var date = time;
  238. if(typeof(time)=="string")
  239. date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, ""));
  240. var diff = (((new Date()).getTime() - date.getTime()) / 1000),
  241. day_diff = Math.floor(diff / 86400);
  242. if ( isNaN(day_diff) || day_diff < 0 )
  243. return '';
  244. return day_diff == 0 && (
  245. diff < 60 && "just now" ||
  246. diff < 120 && "1 minute ago" ||
  247. diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
  248. diff < 7200 && "1 hour ago" ||
  249. diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
  250. day_diff == 1 && "Yesterday" ||
  251. day_diff < 7 && day_diff + " days ago" ||
  252. day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
  253. day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" ||
  254. "more than " + Math.floor( day_diff / 365 ) + " year(s) ago";
  255. }
  256. // If jQuery is included in the page, adds a jQuery plugin to handle it as well
  257. if ( typeof jQuery != "undefined" )
  258. jQuery.fn.prettyDate = function(){
  259. return this.each(function(){
  260. var date = prettyDate(this.title);
  261. if ( date )
  262. jQuery(this).text( date );
  263. });
  264. };
  265. var comment_when = prettyDate;
  266. wn.datetime.comment_when = prettyDate;
  267. // globals (deprecate)
  268. var date = dateutil = wn.datetime;
  269. var get_today = wn.datetime.get_today
  270. var time_to_ampm = wn.datetime.time_to_ampm;
  271. var time_to_hhmm = wn.datetime.time_to_hhmm;
  272. var only_date = wn.datetime.only_date;