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