root / projects / DailyDrillingReport_1.2 / Deliveries / PDFreport / difference / date.msxsl.xsl @ 336

Revision 336, 42.1 kB (checked in by karianne, 8 years ago)
Line 
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**/
24var gsSuppliedFormat = "";
25var gsLang = "en";
26var gaLang = new Array();
27// en
28gaLang["en"] = new Array();
29gaLang["en"]["months"] = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
30gaLang["en"]["shortMonths"] = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
31gaLang["en"]["days"] = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
32gaLang["en"]["shortDays"] = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
33
34
35var gaDayNames = new Array();
36gaDayNames["sunday"] = 0;gaDayNames["monday"] = 1;gaDayNames["tuesday"] = 2;gaDayNames["wednesday"] = 3;gaDayNames["thursday"] = 4;gaDayNames["friday"] = 5;gaDayNames["saturday"] = 6;
37var gaMonthCnt = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
38var gaMonthCntL = new Array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
39function _isLeap(y){return ( ((y%4==0)&(y%100!=0))|(y%400==0) );}
40function _dayOfWeek(y,d){return ( ((y-1)+Math.floor((y-1)/4)-Math.floor((y-1)/100)+Math.floor((y-1)/400)+d)%7);}
41function _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**/
53function 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**/
75function 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**/
103function 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**/
123function 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**/
141function 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}
153function _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**/
177function 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**/
203function 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}
215function _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**/
236function 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**/
262function 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}
274function _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**/
299function 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}
311function _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**/
336function 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**/
363function 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**/
387function 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 &amp; Number)     July &amp; 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**/
534function 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**/
556function 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**/
580function 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**/
604function 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}
618function _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**/
642function 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**/
669function 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}
683function _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**/
709function 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**/
740function 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**/
762function 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**/
789function 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}
813function   _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**/
842function 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**/
866function 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}
878function _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**/
905function 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}
916function _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**/
938function 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/**
953Private functions.
954**/
955function _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 &amp; Number)     July &amp; 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}
1164function _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}
1197function pad(v){
1198        return (v<10?"0"+v:v);
1199}
1200
1201function _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
1212function 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}
1226var giYearMill = 31536000000;
1227var giMonthMill = 2592000000;
1228var giDayMill = 86400000;
1229var giHourMill = 3600000;
1230var giMinMill = 60000;
1231var giSecMill = 1000;
1232function _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>
Note: See TracBrowser for help on using the browser.