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

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

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