PageRenderTime 55ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/WebContent/WEB-INF/mozart/wp/xslt/html/exslt/date.js

http://mozart.googlecode.com/
JavaScript | 1257 lines | 932 code | 8 blank | 317 comment | 206 complexity | 88232fb022646d57b3a05e163b7b65d5 MD5 | raw file
Possible License(s): Apache-2.0, GPL-3.0
  1. /**
  2. <doc:module date="2001-06-12">
  3. <doc:module>exslt:date-time</doc:module>
  4. <doc:name>dates</doc:name>
  5. <doc:version>2.0</doc:version>
  6. <doc:language>exslt:javascript</doc:language>
  7. <doc:meta>
  8. <doc:author email="chris@bayes.co.uk" url="http://www.bayes.co.uk">Chris Bayes</doc:author>
  9. <doc:summary>Implementation of EXSLT - Dates (http://www.exslt.org/date)</doc:summary>
  10. <doc:todo>_validDuration is not 100%</doc:todo>
  11. <doc:todo>All timezone code.</doc:todo>
  12. </doc:meta>
  13. </doc:module>
  14. **/
  15. var gsSuppliedFormat = "";
  16. var gsLang = "en";
  17. var gaLang = new Array();
  18. // en
  19. gaLang["en"] = new Array();
  20. gaLang["en"]["months"] = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
  21. gaLang["en"]["shortMonths"] = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
  22. gaLang["en"]["days"] = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
  23. gaLang["en"]["shortDays"] = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
  24. var gaDayNames = new Array();
  25. gaDayNames["sunday"] = 0;gaDayNames["monday"] = 1;gaDayNames["tuesday"] = 2;gaDayNames["wednesday"] = 3;gaDayNames["thursday"] = 4;gaDayNames["friday"] = 5;gaDayNames["saturday"] = 6;
  26. var gaMonthCnt = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  27. var gaMonthCntL = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  28. function _isLeap(y){return ( ((y%4==0)&(y%100!=0))|(y%400==0) );}
  29. function _dayOfWeek(y,d){return ( ((y-1)+Math.floor((y-1)/4)-Math.floor((y-1)/100)+Math.floor((y-1)/400)+d)%7);}
  30. function _dayInYear(y,m,d){return (m==0?d:eval( (_isLeap(y)?gaMonthCntL.slice(0,m).join("+"):gaMonthCnt.slice(0,m).join("+")) )+(d*1) );}
  31. /**
  32. <doc:function date="2001-06-12">
  33. <doc:name>add</doc:name>
  34. <doc:version>2.0</doc:version>
  35. <doc:return type="string" />
  36. <doc:args>
  37. <doc:arg name="date" type="string" default="''" optional="no"></doc:arg>
  38. <doc:arg name="duration" type="string" default="''" optional="no"></doc:arg>
  39. </doc:args>
  40. </doc:function>
  41. **/
  42. function add(){//
  43. var d1,d2;
  44. if (((d1 = _validDate(arguments[0], "xs:dateTime")) ||
  45. (d1 = _validDate(arguments[0], "xs:date")) ||
  46. (d1 = _validDate(arguments[0], "xs:gYearMonth")) ||
  47. (d1 = _validDate(arguments[0], "xs:gYear"))
  48. ) &&
  49. (d2 = _validDuration(arguments[1])))
  50. return _formatDate(d2.addDate(d1), gsSuppliedFormat);
  51. return '';
  52. }
  53. /**
  54. <doc:function date="2001-06-12">
  55. <doc:name>addDuration</doc:name>
  56. <doc:version>2.0</doc:version>
  57. <doc:return type="string" />
  58. <doc:args>
  59. <doc:arg name="duration" type="string" default="''" optional="no"></doc:arg>
  60. <doc:arg name="duration" type="string" default="''" optional="no"></doc:arg>
  61. </doc:args>
  62. </doc:function>
  63. **/
  64. function addDuration(duration1, duration2){
  65. if ((d1 = _validDuration(duration1)) && (d2 = _validDuration(duration2))){
  66. var d1mnth = d1.years *12 + d1.months;
  67. var d1secs = d1.days*86400 + d1.hours*3600 + d1.minutes*60 + (d1.seconds+'.'+d1.fraction)*1;
  68. var d2mnth = d2.years *12 + d2.months;
  69. var d2secs = d2.days*86400 + d2.hours*3600 + d2.minutes*60 + (d2.seconds+'.'+d2.fraction)*1;
  70. var mnthdiff = (d1.pm+d1mnth)*1 + (d2.pm+d2mnth)*1;
  71. var secsdiff = (d1.pm+d1secs)*1 + (d2.pm+d2secs)*1;
  72. if ((mnthdiff < 0 && secsdiff > 0) || (mnthdiff > 0 && secsdiff < 0))
  73. return '';
  74. var secs = secsdiff % 60;
  75. var pm = (mnthdiff<0||secsdiff<0?'-':'');
  76. mnthdiff = Math.abs(mnthdiff);
  77. secsdiff = Math.abs(secsdiff);
  78. return _formatDuration(new Duration(pm, 0, mnthdiff, Math.floor(secsdiff/86400), Math.floor((secsdiff%86400)/3600), Math.floor((secsdiff%3600)/60), Math.floor(secs), Math.floor(secs%1)));
  79. }
  80. return '';
  81. }
  82. /**
  83. <doc:function date="2001-06-12">
  84. <doc:name>date</doc:name>
  85. <doc:version>2.0</doc:version>
  86. <doc:return type="string" />
  87. <doc:args>
  88. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  89. </doc:args>
  90. </doc:function>
  91. **/
  92. function date(){//
  93. if (arguments.length > 0){
  94. var oDate;
  95. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  96. (oDate = _validDate(arguments[0], "xs:date"))
  97. )
  98. return _formatDate(oDate, "xs:date");
  99. else
  100. return '';
  101. }else
  102. return _formatDate(new Date(), "xs:date");
  103. }
  104. /**
  105. <doc:function date="2001-06-12">
  106. <doc:name>dateTime</doc:name>
  107. <doc:version>2.0</doc:version>
  108. <doc:return type="string" />
  109. <doc:args />
  110. </doc:function>
  111. **/
  112. function dateTime(){//must be UTC/Z
  113. if (arguments.length > 0)
  114. dateTime_invalidArgument.error;
  115. var oDate = new Date();
  116. return _formatDate(oDate, "xs:dateTime");
  117. }
  118. /**
  119. <doc:function date="2001-06-12">
  120. <doc:name>dayAbbreviation</doc:name>
  121. <doc:version>2.0</doc:version>
  122. <doc:return type="string" />
  123. <doc:args>
  124. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  125. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  126. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  127. </doc:args>
  128. </doc:function>
  129. **/
  130. function dayAbbreviation(){
  131. if (arguments.length > 0){
  132. var oDate;
  133. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  134. (oDate = _validDate(arguments[0], "xs:date"))
  135. )
  136. return _dayAbbreviation(oDate.getDay(), arguments[1], arguments[2]);
  137. else
  138. return '';
  139. }else
  140. return _dayAbbreviation(new Date().getDay(), arguments[1], arguments[2]);
  141. }
  142. function _dayAbbreviation(num, dfName, ctx){
  143. if (ctx != null){
  144. var nodes = ctx.nextNode.selectNodes(
  145. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  146. "/*[local-name()='days' and namespace-uri()='http://exslt.org/dates-and-times']" +
  147. "/*[local-name()='day' and namespace-uri()='http://exslt.org/dates-and-times']/@abbr");
  148. if (nodes != null)
  149. return nodes[num].nodeValue;
  150. else
  151. return '';
  152. }else{ //we could try local
  153. return gaLang[gsLang]["shortDays"][num*1];
  154. }
  155. }
  156. /**
  157. <doc:function date="2001-06-12">
  158. <doc:name>dayInMonth</doc:name>
  159. <doc:version>2.0</doc:version>
  160. <doc:return type="number" />
  161. <doc:args>
  162. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  163. </doc:args>
  164. </doc:function>
  165. **/
  166. function dayInMonth(){//
  167. if (arguments.length > 0){
  168. var oDate;
  169. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  170. (oDate = _validDate(arguments[0], "xs:date")) ||
  171. (oDate = _validDate(arguments[0], "xs:gMonthDay")) ||
  172. (oDate = _validDate(arguments[0], "xs:gDay"))
  173. )
  174. return oDate.getDate();
  175. else
  176. return Number.NaN
  177. }else
  178. return new Date().getDate();
  179. }
  180. /**
  181. <doc:function date="2001-06-12">
  182. <doc:name>dayInWeek</doc:name>
  183. <doc:version>2.0</doc:version>
  184. <doc:return type="number" />
  185. <doc:args>
  186. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  187. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  188. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  189. </doc:args>
  190. </doc:function>
  191. **/
  192. function dayInWeek(){//
  193. if (arguments.length > 0){
  194. var oDate;
  195. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  196. (oDate = _validDate(arguments[0], "xs:date"))
  197. )
  198. return _dayInWeek(oDate, arguments[1], arguments[2]);
  199. else
  200. return Number.NaN;
  201. }else
  202. return _dayInWeek(new Date(), arguments[1], arguments[2]);
  203. }
  204. function _dayInWeek(oDate, dfName, ctx){
  205. var fdow = 0;
  206. if (ctx != null){
  207. var nodes = ctx.nextNode.selectSingleNode(
  208. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  209. "/@first-day-of-week");
  210. if (nodes != null)
  211. fdow = gaDayNames[nodes.nodeValue];
  212. }
  213. return (oDate.getDay()-fdow<0?oDate.getDay()-fdow+7:oDate.getDay()-fdow)+1;
  214. }
  215. /**
  216. <doc:function date="2001-06-12">
  217. <doc:name>dayInYear</doc:name>
  218. <doc:version>2.0</doc:version>
  219. <doc:return type="number" />
  220. <doc:args>
  221. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  222. </doc:args>
  223. </doc:function>
  224. **/
  225. function dayInYear(){
  226. if (arguments.length > 0){
  227. var oDate;
  228. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  229. (oDate = _validDate(arguments[0], "xs:date"))
  230. )
  231. return _dayInYear(oDate.getFullYear(), oDate.getMonth(), oDate.getDate());
  232. else
  233. return Number.NaN;
  234. }else{
  235. var oDate = new Date()
  236. return _dayInYear(oDate.getFullYear(), oDate.getMonth(), oDate.getDate());
  237. }
  238. }
  239. /**
  240. <doc:function date="2001-06-12">
  241. <doc:name>dayName</doc:name>
  242. <doc:version>2.0</doc:version>
  243. <doc:return type="string" />
  244. <doc:args>
  245. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  246. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  247. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  248. </doc:args>
  249. </doc:function>
  250. **/
  251. function dayName(){
  252. if (arguments.length > 0){
  253. var oDate;
  254. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  255. (oDate = _validDate(arguments[0], "xs:date"))
  256. )
  257. return _dayName(oDate.getDay(), arguments[1], arguments[2]);
  258. else
  259. return '';
  260. }else
  261. return _dayName(new Date().getDay(), arguments[1], arguments[2]);
  262. }
  263. function _dayName(num, dfName, ctx){
  264. if (ctx != null){
  265. var nodes = ctx.nextNode.selectNodes(
  266. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  267. "/*[local-name()='days' and namespace-uri()='http://exslt.org/dates-and-times']" +
  268. "/*[local-name()='day' and namespace-uri()='http://exslt.org/dates-and-times']/text()");
  269. if (nodes != null)
  270. return nodes[num].nodeValue;
  271. else
  272. return '';
  273. }else
  274. return gaLang[gsLang]["days"][num*1];
  275. }
  276. /**
  277. <doc:function date="2001-06-12">
  278. <doc:name>dayOfWeekInMonth</doc:name>
  279. <doc:version>2.0</doc:version>
  280. <doc:return type="number" />
  281. <doc:args>
  282. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  283. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  284. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  285. </doc:args>
  286. </doc:function>
  287. **/
  288. function dayOfWeekInMonth(){
  289. if (arguments.length > 0){
  290. var oDate;
  291. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  292. (oDate = _validDate(arguments[0], "xs:date"))
  293. )
  294. return _dayOfWeekInMonth(oDate, arguments[1], arguments[2]);
  295. else
  296. return Number.NaN;
  297. }else
  298. return _dayOfWeekInMonth(new Date(), arguments[1], arguments[2]);
  299. }
  300. function _dayOfWeekInMonth(oDate, dfName, ctx){
  301. var fdow = 0;
  302. if (ctx != null){
  303. var nodes = ctx.nextNode.selectSingleNode(
  304. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  305. "/@first-day-of-week");
  306. if (nodes != null)
  307. fdow = gaDayNames[nodes.nodeValue];
  308. }
  309. if (fdow > (oDate.getDay()-1))
  310. return Math.floor((oDate.getDate())/7)+1;
  311. else
  312. return Math.floor((oDate.getDate())/7) + 1;
  313. }
  314. /**
  315. <doc:function date="2001-06-12">
  316. <doc:name>difference</doc:name>
  317. <doc:version>2.0</doc:version>
  318. <doc:return type="string" />
  319. <doc:args>
  320. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  321. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  322. </doc:args>
  323. </doc:function>
  324. **/
  325. function difference(){
  326. if (((d1 = _validDate(arguments[0], "xs:dateTime")) ||
  327. (d1 = _validDate(arguments[0], "xs:date")) ||
  328. (d1 = _validDate(arguments[0], "xs:gYearMonth")) ||
  329. (d1 = _validDate(arguments[0], "xs:gYear"))
  330. ) &&
  331. ((d2 = _validDate(arguments[1], "xs:dateTime")) ||
  332. (d2 = _validDate(arguments[1], "xs:date")) ||
  333. (d2 = _validDate(arguments[1], "xs:gYearMonth")) ||
  334. (d2 = _validDate(arguments[1], "xs:gYear"))
  335. )
  336. ){// truncation
  337. var diffMil = d2.valueOf() - d1.valueOf();
  338. return _formatDuration(diffMil);
  339. }
  340. return Number.NaN;
  341. }
  342. /**
  343. <doc:function date="2001-06-12">
  344. <doc:name>duration</doc:name>
  345. <doc:version>2.0</doc:version>
  346. <doc:return type="string" />
  347. <doc:args>
  348. <doc:arg name="seconds" type="number" default="''" optional="yes"></doc:arg>
  349. </doc:args>
  350. </doc:function>
  351. **/
  352. function duration(){
  353. var oDate;
  354. if (arguments.length > 0){
  355. var nN = new Number(arguments[0]);
  356. if (isNaN(nN))
  357. return '';
  358. else
  359. return _formatDuration(arguments[0] * 1000);
  360. }else
  361. return _formatDuration(seconds() * 1000);
  362. }
  363. /**
  364. <doc:function date="2001-06-12">
  365. <doc:name>formatDate</doc:name>
  366. <doc:version>1.0</doc:version>
  367. <doc:return type="string" />
  368. <doc:args>
  369. <doc:arg name="date" type="string" default="''" optional="no"></doc:arg>
  370. <doc:arg name="format" type="string" default="''" optional="no"></doc:arg>
  371. <doc:arg name="date-format" type="string" default="''" optional="no"></doc:arg>
  372. <doc:arg name="context" type="document" default="null" optional="yes"></doc:arg>
  373. </doc:args>
  374. </doc:function>
  375. **/
  376. function formatDate(date, format, dateF, ctx){
  377. var oDate;
  378. var re;
  379. var retString = "";
  380. if ((oDate = _validDate(date, "xs:dateTime")) ||
  381. (oDate = _validDate(date, "xs:date")) ||
  382. (oDate = _validDate(date, "xs:time")) ||
  383. (oDate = _validDate(date, "xs:gYearMonth")) ||
  384. (oDate = _validDate(date, "xs:gYear")) ||
  385. (oDate = _validDate(date, "xs:gMonthDay")) ||
  386. (oDate = _validDate(date, "xs:gMonth")) ||
  387. (oDate = _validDate(date, "xs:gDay"))
  388. ){
  389. for (var i=0; i < format.length;){
  390. var s = i;
  391. switch(format.substr(i, 1)){
  392. case "G":// era designator (Text) AD
  393. while (format.substr(i, 1)=="G"){i++;}
  394. if (oDate.getFullYear() < 0){
  395. retString += "BC";
  396. }else{
  397. retString += "AD";
  398. }
  399. break;
  400. case "y":// year (Number) 1996
  401. while (format.substr(i, 1)=="y"){i++;}
  402. if (i-s > 2){
  403. retString += oDate.getFullYear();
  404. }else{
  405. retString += oDate.getFullYear().toString().substring(4-(i-s));
  406. }
  407. break;
  408. case "M":// month in year (Text &amp; Number) July &amp; 07
  409. while (format.substr(i, 1)=="M"){i++;}
  410. if (i-s <= 2){
  411. retString += pad(oDate.getMonth()+1);
  412. }else{
  413. retString += _monthName(oDate.getMonth(), dateF, ctx);
  414. }
  415. break;
  416. case "d":// day in month (Number) 10
  417. while (format.substr(i, 1)=="d"){i++;}
  418. retString += pad(oDate.getDate());
  419. break;
  420. case "h":// hour in am/pm (1~12) (Number) 12
  421. while (format.substr(i, 1)=="h"){i++;}
  422. if (oDate.getHours() > 12){
  423. retString += pad(oDate.getHours()-12);
  424. }else{
  425. retString += pad(oDate.getHours());
  426. }
  427. break;
  428. case "H":// hour in day (0~23) (Number) 0
  429. while (format.substr(i, 1)=="H"){i++;}
  430. retString += oDate.getHours();
  431. break;
  432. case "m":// minute in hour (Number) 30
  433. while (format.substr(i, 1)=="m"){i++;}
  434. retString += pad(oDate.getMinutes());
  435. break;
  436. case "s":// second in minute (Number) 55
  437. while (format.substr(i, 1)=="s"){i++;}
  438. retString += pad(oDate.getSeconds());
  439. break;
  440. case "S":// millisecond (Number) 978
  441. while (format.substr(i, 1)=="S"){i++;}
  442. retString += oDate.getMilliseconds();
  443. break;
  444. case "E":// day in week (Text) Tuesday
  445. while (format.substr(i, 1)=="E"){i++;}
  446. retString += dayInWeek(oDate, dateF, ctx);
  447. break;
  448. case "D":// day in year (Number) 189
  449. while (format.substr(i, 1)=="D"){i++;}
  450. retString += _dayInYear(oDate.getFullYear(), oDate.getMonths(), oDate.getDate());
  451. break;
  452. case "F":// day of week in month (Number) 2 (2nd Wed in July)
  453. while (format.substr(i, 1)=="F"){i++;}
  454. retString += dayOfWeekInMonth(oDate, dateF, ctx);
  455. break;
  456. case "w":// week in year (Number) 27
  457. while (format.substr(i, 1)=="w"){i++;}
  458. retString += weekInYear(oDate, dateF, ctx);
  459. break;
  460. case "W":// week in month (Number) 2
  461. while (format.substr(i, 1)=="W"){i++;}
  462. retString += weekInMonth(oDate, dateF, ctx);
  463. break;
  464. case "a":// am/pm marker (Text) PM
  465. while (format.substr(i, 1)=="a"){i++;}
  466. if (oDate.getHours() > 12 ){
  467. retString += "PM"
  468. }else{
  469. retString += "AM"
  470. }
  471. break;
  472. case "k":// hour in day (1~24) (Number) 24
  473. while (format.substr(i, 1)=="k"){i++;}
  474. retString += oDate.getHours();
  475. break;
  476. case "K":// hour in am/pm (0~11) (Number) 0
  477. while (format.substr(i, 1)=="K"){i++;}
  478. if (oDate.getHours() > 12){
  479. retString += oDate.getHours()-12;
  480. }else{
  481. retString += oDate.getHours();
  482. }
  483. break;
  484. case "z":// time zone (Text) Pacific Standard Time
  485. while (format.substr(i, 1)=="z"){i++;}
  486. var tzo = oDate.getTimezoneOffset();
  487. retString += (tzo < 0?"-":"+") + pad(Math.abs(tzo / 60)) + ":" + pad(tzo % 60);
  488. break;
  489. case "'":// escape for text (Delimiter)
  490. if (format.substr(i+1, 1) == "'"){
  491. i++;
  492. while (format.substr(i, 1)=="'"){i++;}
  493. retString += "'";
  494. }else{
  495. i++;
  496. while (format.substr(i, 1)!="'" && i <= format.length){retString += format.substr(i++, 1);}
  497. if (i >= format.length)return '';
  498. i++;
  499. }
  500. break;
  501. default:
  502. retString += format.substr(i, 1);
  503. i++;
  504. break;
  505. }
  506. }
  507. }
  508. return retString;
  509. }
  510. /**
  511. <doc:function date="2001-06-12">
  512. <doc:name>hourInDay</doc:name>
  513. <doc:version>2.0</doc:version>
  514. <doc:return type="number" />
  515. <doc:args>
  516. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  517. </doc:args>
  518. </doc:function>
  519. **/
  520. function hourInDay(){//
  521. if (arguments.length > 0){
  522. var oDate;
  523. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  524. (oDate = _validDate(arguments[0], "xs:time"))
  525. )
  526. return oDate.getHours();
  527. else
  528. return Number.NaN;
  529. }else
  530. return new Date().getHours();
  531. }
  532. /**
  533. <doc:function date="2001-06-12">
  534. <doc:name>leapYear</doc:name>
  535. <doc:version>2.0</doc:version>
  536. <doc:return type="boolean" />
  537. <doc:args>
  538. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  539. </doc:args>
  540. </doc:function>
  541. **/
  542. function leapYear(){
  543. if (arguments.length > 0 && arguments[0] != ''){
  544. var oDate;
  545. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  546. (oDate = _validDate(arguments[0], "xs:date")) ||
  547. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  548. (oDate = _validDate(arguments[0], "xs:gYear"))
  549. )
  550. return (_isLeap(oDate.getFullYear())?true:false);
  551. else
  552. return Number.NaN;
  553. }else
  554. return (_isLeap(new Date().getFullYear())?true:false);
  555. }
  556. /**
  557. <doc:function date="2001-06-12">
  558. <doc:name>minuteInHour</doc:name>
  559. <doc:version>2.0</doc:version>
  560. <doc:return type="number" />
  561. <doc:args>
  562. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  563. </doc:args>
  564. </doc:function>
  565. **/
  566. function minuteInHour(){//
  567. if (arguments.length > 0){
  568. var oDate;
  569. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  570. (oDate = _validDate(arguments[0], "xs:time"))
  571. )
  572. return oDate.getMinutes();
  573. else
  574. return Number.NaN;
  575. }else
  576. return new Date().getMinutes();
  577. }
  578. /**
  579. <doc:function date="2001-06-12">
  580. <doc:name>monthAbbreviation</doc:name>
  581. <doc:version>2.0</doc:version>
  582. <doc:return type="string" />
  583. <doc:args>
  584. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  585. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  586. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  587. </doc:args>
  588. </doc:function>
  589. **/
  590. function monthAbbreviation(){//
  591. if (arguments.length > 0){
  592. var oDate;
  593. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  594. (oDate = _validDate(arguments[0], "xs:date")) ||
  595. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  596. (oDate = _validDate(arguments[0], "xs:gMonthDay"))
  597. )
  598. return _monthAbbreviation(oDate.getMonth(), arguments[1], arguments[2]);
  599. else
  600. return '';
  601. }else
  602. return _monthAbbreviation(new Date().getMonth(), arguments[1], arguments[2]);
  603. }
  604. function _monthAbbreviation(num, dfName, ctx){//
  605. if (ctx != null){
  606. var nodes = ctx.nextNode.selectNodes(
  607. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  608. "/*[local-name()='months' and namespace-uri()='http://exslt.org/dates-and-times']" +
  609. "/*[local-name()='month' and namespace-uri()='http://exslt.org/dates-and-times']/@abbr");
  610. if (nodes != null)
  611. return nodes[num].nodeValue;
  612. else
  613. return '';
  614. }else{ //we could try local
  615. return gaLang[gsLang]["shortMonths"][num*1];
  616. }
  617. }
  618. /**
  619. <doc:function date="2001-06-12">
  620. <doc:name>monthInYear</doc:name>
  621. <doc:version>2.0</doc:version>
  622. <doc:return type="number" />
  623. <doc:args>
  624. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  625. </doc:args>
  626. </doc:function>
  627. **/
  628. function monthInYear(){//
  629. if (arguments.length > 0){
  630. var oDate;
  631. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  632. (oDate = _validDate(arguments[0], "xs:date")) ||
  633. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  634. (oDate = _validDate(arguments[0], "xs:gMonthDay")) ||
  635. (oDate = _validDate(arguments[0], "xs:gYear"))
  636. )
  637. return oDate.getMonth()+1;
  638. else
  639. return Number.NaN;
  640. }else
  641. return new Date().getMonth()+1;
  642. }
  643. /**
  644. <doc:function date="2001-06-12">
  645. <doc:name>monthName</doc:name>
  646. <doc:version>2.0</doc:version>
  647. <doc:return type="string" />
  648. <doc:args>
  649. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  650. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  651. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  652. </doc:args>
  653. </doc:function>
  654. **/
  655. function monthName(){//
  656. if (arguments.length > 0){// && arguments[0] != ''
  657. var oDate;
  658. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  659. (oDate = _validDate(arguments[0], "xs:date")) ||
  660. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  661. (oDate = _validDate(arguments[0], "xs:gMonthDay"))
  662. )
  663. return _monthName(oDate.getMonth(), arguments[1], arguments[2]);
  664. else
  665. return '';
  666. }else
  667. return _monthName(new Date().getMonth(), arguments[1], arguments[2]);
  668. }
  669. function _monthName(num, dfName, ctx){//
  670. if (ctx != null){
  671. var nodes = ctx.nextNode.selectNodes(
  672. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  673. "/*[local-name()='months' and namespace-uri()='http://exslt.org/dates-and-times']" +
  674. "/*[local-name()='month' and namespace-uri()='http://exslt.org/dates-and-times']/text()");
  675. if (nodes != null)
  676. return nodes[num].nodeValue;
  677. else
  678. return '';
  679. }else
  680. return gaLang[gsLang]["months"][num*1];
  681. }
  682. /**
  683. <doc:function date="2001-06-12">
  684. <doc:name>parseDate</doc:name>
  685. <doc:version>1.0</doc:version>
  686. <doc:return type="string" />
  687. <doc:args>
  688. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  689. <doc:arg name="input-format" type="string" default="''" optional="no"></doc:arg>
  690. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  691. <doc:arg name="context" type="document" default="null" optional="yes"></doc:arg>
  692. </doc:args>
  693. </doc:function>
  694. **/
  695. function parseDate(date, inFormat, dfName, ctx){//0001
  696. var oDate;
  697. if (inFormat == ""){
  698. if ((oDate = _validDate(date, "xs:dateTime")) ||
  699. (oDate = _validDate(date, "xs:date")) ||
  700. (oDate = _validDate(date, "xs:time")) ||
  701. (oDate = _validDate(date, "xs:gYearMonth")) ||
  702. (oDate = _validDate(date, "xs:gYear")) ||
  703. (oDate = _validDate(date, "xs:gMonthDay")) ||
  704. (oDate = _validDate(date, "xs:gMonth")) ||
  705. (oDate = _validDate(date, "xs:gDay"))
  706. ){
  707. return _formatDate(oDate, "xs:dateTime");
  708. }
  709. }else{
  710. if (oDate = _validDate(date, inFormat))
  711. return _formatDate(oDate, dfName);
  712. else
  713. return '';
  714. }
  715. }
  716. /**
  717. <doc:function date="2001-06-12">
  718. <doc:name>secondInMinute</doc:name>
  719. <doc:version>2.0</doc:version>
  720. <doc:return type="number" />
  721. <doc:args>
  722. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  723. </doc:args>
  724. </doc:function>
  725. **/
  726. function secondInMinute(){//
  727. if (arguments.length > 0){
  728. var oDate;
  729. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  730. (oDate = _validDate(arguments[0], "xs:time"))
  731. )
  732. return oDate.getSeconds();
  733. else
  734. return Number.NaN;
  735. }else
  736. return new Date().getSeconds();
  737. }
  738. /**
  739. <doc:function date="2001-06-12">
  740. <doc:name>seconds</doc:name>
  741. <doc:version>2.0</doc:version>
  742. <doc:return type="number" />
  743. <doc:args>
  744. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  745. </doc:args>
  746. </doc:function>
  747. **/
  748. function seconds(){//
  749. if (arguments.length > 0){
  750. var oDate;
  751. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  752. (oDate = _validDate(arguments[0], "xs:date")) ||
  753. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  754. (oDate = _validDate(arguments[0], "xs:gYear"))
  755. )
  756. return oDate.valueOf()/1000;
  757. else
  758. if (oDate = _validDuration(arguments[0]))
  759. return oDate.Seconds();
  760. else
  761. return Number.NaN;
  762. }else
  763. return Math.floor(new Date().valueOf()/1000);//current local date/time
  764. }
  765. /**
  766. <doc:function date="2001-06-12">
  767. <doc:name>sum</doc:name>
  768. <doc:version>2.0</doc:version>
  769. <doc:return type="string" />
  770. <doc:args>
  771. <doc:arg name="durations" type="node-set" default="''" optional="no"></doc:arg>
  772. </doc:args>
  773. </doc:function>
  774. **/
  775. function sum(ctx){
  776. var sDate = "P0S";
  777. if (typeof(ctx) == "object"){
  778. if (ctx.length){
  779. for (var i=0; i < ctx.length; i++){
  780. ctxN = ctx.item(i);
  781. if (ctxN.nodeType == 1){
  782. if (!(sDate = addDuration(sDate, _wander(ctxN))))
  783. return '';
  784. }
  785. if (ctxN.nodeType == 2){
  786. if (!(sDate = addDuration(sDate, ctxN.nodeValue)))
  787. return '';
  788. }
  789. }
  790. }else{
  791. if (!(sDate = addDuration(sDate, ctx.nodeValue)))
  792. return '';
  793. }
  794. }else{
  795. return '';
  796. }
  797. return sDate;
  798. }
  799. function _wander(ctx){
  800. var sDate = "P0S";
  801. for (var i=0; i < ctx.childNodes.length; i++){
  802. ctxN = ctx.childNodes[i];
  803. switch(ctxN.nodeType){
  804. case 1:
  805. if (!(sDate = addDuration(sDate, _wander(ctxN))))
  806. return '';
  807. break;
  808. case 3:
  809. if (!(sDate = addDuration(sDate, ctxN.nodeValue)))
  810. return '';
  811. break;
  812. default:
  813. break;
  814. }
  815. }
  816. return sDate;
  817. }
  818. /**
  819. <doc:function date="2001-06-12">
  820. <doc:name>time</doc:name>
  821. <doc:version>2.0</doc:version>
  822. <doc:return type="string" />
  823. <doc:args>
  824. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  825. </doc:args>
  826. </doc:function>
  827. **/
  828. function time(){//
  829. if (arguments.length > 0){
  830. var oDate;
  831. if ((oDate = _validDate(arguments[0], "xs:dateTime"))||
  832. (oDate = _validDate(arguments[0], "xs:time"))
  833. )
  834. return _formatDate(oDate, "xs:time");
  835. else
  836. return '';
  837. }else
  838. return _formatDate(new Date(), "xs:time");
  839. }
  840. /**
  841. <doc:function date="2001-06-12">
  842. <doc:name>weekInMonth</doc:name>
  843. <doc:version>2.0</doc:version>
  844. <doc:return type="number" />
  845. <doc:args>
  846. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  847. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  848. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  849. </doc:args>
  850. </doc:function>
  851. **/
  852. function weekInMonth(){
  853. if (arguments.length > 0){
  854. var oDate;
  855. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  856. (oDate = _validDate(arguments[0], "xs:date"))
  857. )
  858. return _weekInMonth(oDate, arguments[1], arguments[2]);
  859. else
  860. return Number.NaN;
  861. }else
  862. return _weekInMonth(new Date(), arguments[1], arguments[2]);
  863. }
  864. function _weekInMonth(oDate, dfName, ctx){
  865. var fdow = 0;
  866. if (ctx != null){
  867. var nodes = ctx.nextNode.selectSingleNode(
  868. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  869. "/@first-day-of-week");
  870. if (nodes != null)
  871. fdow = gaDayNames[nodes.nodeValue];
  872. }
  873. var f = new Date(oDate);
  874. f.setDate(1)
  875. var fd = f.getDay()-1;
  876. var dt = oDate.getDate() + fd - fdow;
  877. return Math.floor((dt)/7)+1;
  878. }
  879. /**
  880. <doc:function date="2001-06-12">
  881. <doc:name>weekInYear</doc:name>
  882. <doc:version>2.0</doc:version>
  883. <doc:return type="number" />
  884. <doc:args>
  885. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  886. <doc:arg name="date-format" type="string" default="''" optional="yes"></doc:arg>
  887. <doc:arg name="context" type="context" default="null" optional="yes"></doc:arg>
  888. </doc:args>
  889. </doc:function>
  890. **/
  891. function weekInYear(){
  892. if (arguments.length > 0){
  893. var oDate;
  894. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  895. (oDate = _validDate(arguments[0], "xs:date"))
  896. )
  897. return _weekInYear(oDate, arguments[1], arguments[2]);
  898. }else
  899. return _weekInYear(new Date());
  900. return '';
  901. }
  902. function _weekInYear(oDate, dfName, ctx){
  903. var fdow = 0;
  904. if (ctx != null){
  905. var nodes = ctx.nextNode.selectSingleNode(
  906. "//*[local-name()='date-format' and namespace-uri()='http://exslt.org/dates-and-times' and @name='" + dfName +"' ]" +
  907. "/@first-day-of-week");
  908. if (nodes != null)
  909. fdow = gaDayNames[nodes.nodeValue];
  910. return Math.ceil(_dayInYear(oDate.getFullYear(), oDate.getMonth(), oDate.getDate()+(7-fdow)) / 7);
  911. }else
  912. return Math.ceil(_dayInYear(oDate.getFullYear(), oDate.getMonth(), oDate.getDate()) / 7);
  913. }
  914. /**
  915. <doc:function date="2001-06-12">
  916. <doc:name>year</doc:name>
  917. <doc:version>2.0</doc:version>
  918. <doc:return type="number" />
  919. <doc:args>
  920. <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
  921. </doc:args>
  922. </doc:function>
  923. **/
  924. function year(){//
  925. if (arguments.length > 0){
  926. var oDate;
  927. if ((oDate = _validDate(arguments[0], "xs:dateTime")) ||
  928. (oDate = _validDate(arguments[0], "xs:date")) ||
  929. (oDate = _validDate(arguments[0], "xs:gYearMonth")) ||
  930. (oDate = _validDate(arguments[0], "xs:gYear"))
  931. )
  932. return oDate.getFullYear();
  933. else
  934. return Number.NaN;
  935. }else
  936. return new Date().getFullYear();
  937. }
  938. /**
  939. Private functions.
  940. **/
  941. function _validDate(date, format){
  942. var parts;
  943. var oDate = new Date(-62135596800000); // Mon Jan 1 00:00:00 UTC 1
  944. switch(format){
  945. case "xs:dateTime": //(CCYY-MM-DDThh:mm:ss)
  946. var re = new RegExp("^([0-9]{4})-([0-9]{2})-([0-9]{2})(T([0-9]{2})(:([0-9]{2})(:([0-9]{2}))?)?)?(Z)?([\+\-][0-9]{2}:[0-9]{2})?$");
  947. if (parts=re.exec(date)){
  948. if (parts[10] == "Z"){
  949. oDate.setFullYear(parts[1], parts[2]-1, parts[3]);
  950. oDate.setHours(parts[5], parts[7], parts[9]);
  951. oDate.setMinutes(oDate.getMinutes()-oDate.getTimezoneOffset());
  952. gsSuppliedFormat = "xs:dateTime";
  953. return oDate;
  954. }else{
  955. oDate.setFullYear(parts[1], parts[2]-1, parts[3]);
  956. oDate.setHours(parts[5], parts[7], parts[9]);
  957. gsSuppliedFormat = "xs:dateTime";
  958. return oDate;
  959. }
  960. }
  961. break;
  962. case "xs:date": //(CCYY-MM-DD)
  963. var re = new RegExp("^([0-9]{4})-([0-9]{2})-([0-9]{2})$");
  964. if (parts=re.exec(date)){
  965. oDate.setFullYear(parts[1], parts[2]-1, parts[3]);
  966. gsSuppliedFormat = "xs:date";
  967. return oDate;
  968. }
  969. break;
  970. case "xs:time": //(hh:mm:ss)
  971. var re = new RegExp("^([0-9]{2})(:([0-9]{2})(:([0-9]{2}))?)?(Z)?$");
  972. if (parts=re.exec(date)){
  973. if (parts[9] == "Z"){
  974. oDate.setHours(parts[1], parts[3], parts[5]);
  975. oDate.setMinutes(oDate.getMinutes()-oDate.getTimezoneOffset());
  976. gsSuppliedFormat = "xs:time";
  977. return oDate;
  978. }else{
  979. oDate.setHours(parts[1], parts[3], parts[5]);
  980. gsSuppliedFormat = "xs:time";
  981. return oDate;
  982. }
  983. }
  984. break;
  985. case "xs:gYearMonth": //(CCYY-MM)
  986. var re = new RegExp("^([0-9]{4})-([0-9]{2})$");
  987. if (parts=re.exec(date)){
  988. oDate.setFullYear(parts[1], parts[2]-1);
  989. gsSuppliedFormat = "xs:gYearMonth";
  990. return oDate;
  991. }
  992. break;
  993. case "xs:gYear": //(CCYY)
  994. var re = new RegExp("^([0-9]{4})$");
  995. if (parts=re.exec(date)){
  996. oDate.setFullYear(parts[1]);
  997. gsSuppliedFormat = "xs:gYear";
  998. return oDate;
  999. }
  1000. break;
  1001. case "xs:gMonthDay": //(^--MM-DD)
  1002. var re = new RegExp("--([0-9]{2})-([0-9]{2})");
  1003. if (parts=re.exec(date)){
  1004. oDate.setMonth(parts[1]-1, parts[2]);
  1005. gsSuppliedFormat = "xs:gMonthDay";
  1006. return oDate;
  1007. }
  1008. break;
  1009. case "xs:gMonth": //(--MM--)
  1010. var re = new RegExp("^--([0-9]{2})--$");
  1011. if (parts=re.exec(date)){
  1012. oDate.setMonth(parts[1]-1);
  1013. gsSuppliedFormat = "xs:gMonth";
  1014. return oDate;
  1015. }
  1016. break;
  1017. case "xs:gDay": //(---DD)
  1018. var re = new RegExp("^---([0-9]{2})$");
  1019. if (parts=re.exec(date)){
  1020. oDate.setDate(parts[1]);
  1021. gsSuppliedFormat = "xs:gDay";
  1022. return oDate;
  1023. }
  1024. break;
  1025. default:
  1026. // format string
  1027. var Z = "";
  1028. for (var i=0,j=0; i < format.length & oDate.toString() != "NaN";){
  1029. var s = j;
  1030. switch(format.substr(i, 1)){
  1031. case "G":// era designator (Text) AD
  1032. while (format.substr(i, 1)=="G"){i++;j++;}
  1033. j++;
  1034. if (date.substr(s,j-s) == "BC" || date.substr(s,j-s) == "bc"){
  1035. oDate.setFullYear(-oDate.getFullYear);
  1036. }
  1037. break;
  1038. case "y":// year (Number) 1996
  1039. while (format.substr(i, 1)=="y"){i++;j++;}
  1040. oDate.setYear(date.substr(s,j-s));
  1041. break;
  1042. case "M":// month in year (Text &amp; Number) July &amp; 07
  1043. while (format.substr(i, 1)=="M"){i++;j++;}
  1044. if (i-s <= 2){
  1045. oDate.setMonth(date.substr(s,j-s)-1);
  1046. }else{
  1047. oDate.setMonth(_monthNumber(date.substr(s,j-s)));
  1048. }
  1049. break;
  1050. case "d":// day in month (Number) 10
  1051. while (format.substr(i, 1)=="d"){i++;j++;}
  1052. oDate.setDate(date.substr(s,j-s));
  1053. break;
  1054. case "h":// hour in am/pm (1~12) (Number) 12
  1055. while (format.substr(i, 1)=="h"){i++;j++;}
  1056. oDate.setHours(date.substr(s,j-s));
  1057. break;
  1058. case "H":// hour in day (0~23) (Number) 0
  1059. while (format.substr(i, 1)=="H"){i++;j++;}
  1060. oDate.setHours(date.substr(s,j-s));
  1061. break;
  1062. case "m":// minute in hour (Number) 30
  1063. while (format.substr(i, 1)=="m"){i++;j++;}
  1064. oDate.setMinutes(date.substr(s,j-s));
  1065. break;
  1066. case "s":// second in minute (Number) 55
  1067. while (format.substr(i, 1)=="s"){i++;j++;}
  1068. oDate.setSeconds(date.substr(s,j-s));
  1069. break;
  1070. case "S":// millisecond (Number) 978
  1071. while (format.substr(i, 1)=="S"){i++;j++;}
  1072. oDate.setMilliseconds(date.substr(s,j-s));
  1073. break;
  1074. case "E":// day in week (Text) Tuesday
  1075. while (format.substr(i, 1)=="E"){i++;j++;}
  1076. while (format.substr(i+1, 1)!=date.substr(j, 1)){j++;}
  1077. break;
  1078. case "D":// day in year (Number) 189
  1079. while (format.substr(i, 1)=="D"){i++;j++;}
  1080. while (format.substr(i+1, 1)!=date.substr(j, 1)){j++;}
  1081. break;
  1082. case "F":// day of week in month (Number) 2 (2nd Wed in July)
  1083. while (format.substr(i, 1)=="F"){i++;j++;}
  1084. break;
  1085. case "w":// week in year (Number) 27
  1086. while (format.substr(i, 1)=="w"){i++;j++;}
  1087. while (format.substr(i+1, 1)!=date.substr(j, 1)){j++;}
  1088. break;
  1089. case "W":// week in month (Number) 2
  1090. while (format.substr(i, 1)=="W"){i++;j++;}
  1091. while (format.substr(i+1, 1)!=date.substr(j, 1)){j++;}
  1092. break;
  1093. case "a":// am/pm marker (Text) PM
  1094. while (format.substr(i, 1)=="a"){i++;j++;}
  1095. j++;
  1096. if (date.substr(s,j-s) == "PM" || date.substr(s,j-s) == "pm")
  1097. oDate.setHours(oDate.getHours()+12);
  1098. break;
  1099. case "k":// hour in day (1~24) (Number) 24
  1100. while (format.substr(i, 1)=="k"){i++;j++;}
  1101. oDate.setHours(date.substr(s,j-s));
  1102. break;
  1103. case "K":// hour in am/pm (0~11) (Number) 0
  1104. while (format.substr(i, 1)=="K"){i++;j++;}
  1105. oDate.setHours(date.substr(s,j-s));
  1106. break;
  1107. case "z":// time zone (Text) Pacific Standard Time
  1108. while (format.substr(i, 1)=="z"){i++;j++;}
  1109. while (format.substr(i+1, 1)!=date.substr(j, 1)){j++;}
  1110. //oDate.setMinutes(oDate.getMinutes() - oDate.getTimezoneOffset());
  1111. Z = date.substr(s,j-s);
  1112. break;
  1113. case "'":// escape for text (Delimiter)
  1114. if (format.substr(i+1, 1) == "'"){
  1115. i+=2;
  1116. }else{
  1117. i++;
  1118. while (format.substr(i, 1)!="'"){i++;j++;}
  1119. i++;
  1120. }
  1121. break;
  1122. default:
  1123. if (format.substr(i, 1) != date.substr(j, 1)){
  1124. return false;
  1125. }
  1126. i++;j++;
  1127. break;
  1128. }
  1129. }
  1130. if (j < date.length)
  1131. return false;
  1132. if (oDate.toString() != "NaN"){
  1133. if (Z != ""){
  1134. var re = new RegExp("([\+\-][0-9]{2})?:([0-9]{2})?");
  1135. if (parts=re.exec(Z)){
  1136. // check GMT/BST
  1137. var tzo = parts[1]*60 + parts[2];
  1138. //if (tzo != new Date().getTimezoneOffset()){
  1139. // oDate.setMinutes(oDate.getMinutes() - (oDate.getTimezoneOffset() - tzo))
  1140. //}
  1141. }
  1142. }
  1143. gsSuppliedFormat = "custom";
  1144. return oDate;
  1145. }
  1146. break;
  1147. }
  1148. return false;
  1149. }
  1150. function _formatDate(oDate, format){
  1151. if (oDate == Number.NaN)return Number.NaN;
  1152. switch(format){
  1153. case "xs:dateTime": //(CCYY-MM-DDThh:mm:ss)
  1154. var tzo = oDate.getTimezoneOffset();
  1155. return oDate.getFullYear() + "-" + pad(oDate.getMonth()+1) + "-" + pad(oDate.getDate()) + "T" +
  1156. pad(oDate.getHours()) + ":" + pad(oDate.getMinutes()) + ":" + pad(oDate.getSeconds()) + (tzo < 0?"-":"+") + pad(Math.abs(tzo/60)) + ":" + pad(tzo % 60);
  1157. break;
  1158. case "xs:date": //(CCYY-MM-DD)
  1159. return oDate.getFullYear() + "-" + pad(oDate.getMonth()+1) + "-" + pad(oDate.getDate());
  1160. break;
  1161. case "xs:time": //(hh:mm:ss)
  1162. var tzo = oDate.getTimezoneOffset();
  1163. return pad(oDate.getHours()) + ":" + pad(oDate.getMinutes()) + ":" + pad(oDate.getSeconds()) + (tzo < 0?"-":"+") + pad(Math.abs(tzo/60)) + ":" + pad(tzo % 60);
  1164. break;
  1165. case "xs:gYearMonth": //(CCYY-MM)
  1166. return oDate.getFullYear() + "-" + pad(oDate.getMonth()+1);
  1167. break;
  1168. case "xs:gYear": //(CCYY)
  1169. return oDate.getFullYear();
  1170. break;
  1171. case "xs:gMonthDay": //(--MM-DD)
  1172. return pad(oDate.getMonth() + 1) + "-" + pad(oDate.getDate());
  1173. break;
  1174. case "xs:gMonth": //(--MM--)
  1175. return pad(oDate.getMonth()+1);
  1176. break;
  1177. case "xs:gDay": //(---DD)
  1178. return pad(oDate.getDate());
  1179. break;
  1180. }
  1181. return false;
  1182. }
  1183. function pad(v){
  1184. return (v<10?"0"+v:v);
  1185. }
  1186. function _validDuration(d){
  1187. var parts;
  1188. var re = new RegExp("^([\-])?P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?((T)?(([0-9]+)H)?(([0-9]+)M)?((([0-9]+)(\.([0-9]+))?)S)?)?$");
  1189. if (parts = re.exec(d)){
  1190. if ((/T$/.exec(d)) || (parts[9] == "T" && parts[11]+parts[13]+parts[16]+parts[18]== ""))// ~(:+(|) duh!!!
  1191. return Number.NaN;
  1192. return new Duration(parts[1], parts[3], parts[5], parts[7], parts[11], parts[13], parts[16], parts[18]);
  1193. }
  1194. return Number.NaN;
  1195. }
  1196. function Duration(pm, years, months, days, hours, minutes, seconds, fraction){
  1197. this.pm = pm;
  1198. this.years = years*1;
  1199. this.months = months*1;
  1200. this.days = days*1;
  1201. this.hours = hours*1;
  1202. this.minutes = minutes*1;
  1203. this.seconds = seconds*1;
  1204. this.fraction = fraction*1;
  1205. this.milliseconds = eval('0.'+fraction) * 100;
  1206. this.mask = ((this.years?1:0)<<6) + ((this.months?1:0)<<5) + ((this.days?1:0)<<4) + ((this.hours?1:0)<<3) + ((this.minutes?1:0)<<2) + ((this.seconds?1:0)<<1) + (this.milliseconds?1:0);
  1207. this.addDate = function(d){d.setFullYear(eval(this.pm+this.years)+d.getFullYear(),eval(this.pm+this.months)+d.getMonth(),eval(this.pm+this.days)+d.getDate());d.setHours(eval(this.pm+this.hours)+d.getHours(),eval(this.pm+this.minutes)+d.getMinutes(),eval(this.pm+this.seconds)+d.getSeconds());d.setMilliseconds(eval(this.pm+this.milliseconds));return d;}
  1208. this.Seconds = function(){if (this.years || this.months)return Number.NaN;return this.days*giDayMill + this.hours*giHourMill + this.minutes*giMinMill + this.seconds*giSecMill;}
  1209. }
  1210. var giYearMill = 31536000000;
  1211. var giMonthMill = 2592000000;
  1212. var giDayMill = 86400000;
  1213. var giHourMill = 3600000;
  1214. var giMinMill = 60000;
  1215. var giSecMill = 1000;
  1216. function _formatDuration(du){
  1217. if (typeof(du) == "object"){
  1218. var pm = du.pm;
  1219. var y = du.years;
  1220. var m = du.months;
  1221. var d = du.days;
  1222. var h = du.hours;
  1223. var n = du.minutes;
  1224. var s = du.seconds + du.milliseconds/1000;
  1225. if (y+m+d+h+n+s == 0)
  1226. return 'P0S';
  1227. return pm + "P" +
  1228. (y!=0?y + "Y":'') +
  1229. (m!=0?m + "M":'') +
  1230. (d!=0?d + "D":'') +
  1231. (h+n+s!=0?"T":'') +
  1232. (h!=0?h + "H":'') +
  1233. (n!=0?n + "M":'') +
  1234. (s!=0?s + "S":'');
  1235. }else{
  1236. var pm = (du<0?'-':'');
  1237. du = Math.abs(du);
  1238. var d = Math.floor((du) / giDayMill);
  1239. var h = Math.floor((du % giDayMill) / giHourMill);
  1240. var n = Math.floor((du % giHourMill) / giMinMill);
  1241. var s = Math.floor((du % giMinMill) / giSecMill) + (du % giSecMill)/1000;
  1242. return pm + "P" +
  1243. (d!=0?d + "D":'') +
  1244. (h+n+s!=0?"T":'') +
  1245. (h!=0?h + "H":'') +
  1246. (n!=0?n + "M":'') +
  1247. (s!=0?s + "S":'');
  1248. }
  1249. }